Artifact
9920bcc64f58378ff1118caead34147201f48c68:
- File
tool/showlocks.c
— part of check-in
[6868cc66]
at
2015-04-03 18:33:40
on branch trunk
— Add source code to the "showlocks" utility program in the tool/ subdirectory.
(user:
drh
size: 1465)
[more...]
0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 /*.** This file
0010: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 73 69 6d implements a sim
0020: 70 6c 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 ple command-line
0030: 20 75 74 69 6c 69 74 79 20 74 68 61 74 20 73 68 utility that sh
0040: 6f 77 73 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a ows all of the.*
0050: 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 * Posix Advisory
0060: 20 4c 6f 63 6b 73 20 6f 6e 20 61 20 66 69 6c 65 Locks on a file
0070: 2e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a ..**.** Usage:.*
0080: 2a 0a 2a 2a 20 20 20 20 20 73 68 6f 77 6c 6f 63 *.** showloc
0090: 6b 73 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a ks FILENAME.**.*
00a0: 2a 20 54 6f 20 63 6f 6d 70 69 6c 65 3a 20 20 67 * To compile: g
00b0: 63 63 20 2d 6f 20 73 68 6f 77 6c 6f 63 6b 73 20 cc -o showlocks
00c0: 73 68 6f 77 6c 6f 63 6b 73 2e 63 0a 2a 2f 0a 23 showlocks.c.*/.#
00d0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 include <stdio.h
00e0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 >.#include <unis
00f0: 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c td.h>.#include <
0100: 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 fcntl.h>.#includ
0110: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e e <stdlib.h>.#in
0120: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e clude <string.h>
0130: 0a 0a 2f 2a 20 54 68 69 73 20 75 74 69 6c 69 74 ../* This utilit
0140: 79 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 66 6f 72 y only looks for
0150: 20 6c 6f 63 6b 73 20 69 6e 20 74 68 65 20 66 69 locks in the fi
0160: 72 73 74 20 32 20 62 69 6c 6c 69 6f 6e 20 62 79 rst 2 billion by
0170: 74 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d tes */.#define M
0180: 58 5f 4c 43 4b 20 32 31 34 37 34 38 33 36 34 37 X_LCK 2147483647
0190: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6c ../*.** Print al
01a0: 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 69 l locks on the i
01b0: 6e 6f 64 65 20 6f 66 20 22 66 64 22 20 74 68 61 node of "fd" tha
01c0: 74 20 6f 63 63 75 72 20 69 6e 20 62 65 74 77 65 t occur in betwe
01d0: 65 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64 20 75 70 en.** lwr and up
01e0: 72 2c 20 69 6e 63 6c 75 73 69 76 65 2e 0a 2a 2f r, inclusive..*/
01f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 6f 77 .static int show
0200: 4c 6f 63 6b 73 49 6e 52 61 6e 67 65 28 69 6e 74 LocksInRange(int
0210: 20 66 64 2c 20 6f 66 66 5f 74 20 6c 77 72 2c 20 fd, off_t lwr,
0220: 6f 66 66 5f 74 20 75 70 72 29 7b 0a 20 20 69 6e off_t upr){. in
0230: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 73 74 72 t cnt = 0;. str
0240: 75 63 74 20 66 6c 6f 63 6b 20 78 3b 0a 0a 20 20 uct flock x;..
0250: 78 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c x.l_type = F_WRL
0260: 43 4b 3b 0a 20 20 78 2e 6c 5f 77 68 65 6e 63 65 CK;. x.l_whence
0270: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 78 = SEEK_SET;. x
0280: 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 77 72 3b 0a .l_start = lwr;.
0290: 20 20 78 2e 6c 5f 6c 65 6e 20 3d 20 75 70 72 2d x.l_len = upr-
02a0: 6c 77 72 3b 0a 20 20 66 63 6e 74 6c 28 66 64 2c lwr;. fcntl(fd,
02b0: 20 46 5f 47 45 54 4c 4b 2c 20 26 78 29 3b 0a 20 F_GETLK, &x);.
02c0: 20 69 66 28 20 78 2e 6c 5f 74 79 70 65 3d 3d 46 if( x.l_type==F
02d0: 5f 55 4e 4c 43 4b 20 29 20 72 65 74 75 72 6e 20 _UNLCK ) return
02e0: 30 3b 0a 20 20 70 72 69 6e 74 66 28 22 73 74 61 0;. printf("sta
02f0: 72 74 3a 20 25 2d 31 32 64 20 6c 65 6e 3a 20 25 rt: %-12d len: %
0300: 2d 35 64 20 70 69 64 3a 20 25 2d 35 64 20 74 79 -5d pid: %-5d ty
0310: 70 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 pe: %s\n",.
0320: 20 20 28 69 6e 74 29 78 2e 6c 5f 73 74 61 72 74 (int)x.l_start
0330: 2c 20 28 69 6e 74 29 78 2e 6c 5f 6c 65 6e 2c 0a , (int)x.l_len,.
0340: 20 20 20 20 20 20 20 78 2e 6c 5f 70 69 64 2c 20 x.l_pid,
0350: 78 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 x.l_type==F_WRLC
0360: 4b 20 3f 20 22 57 52 4c 43 4b 22 20 3a 20 22 52 K ? "WRLCK" : "R
0370: 44 4c 43 4b 22 29 3b 0a 20 20 63 6e 74 2b 2b 3b DLCK");. cnt++;
0380: 0a 20 20 69 66 28 20 78 2e 6c 5f 73 74 61 72 74 . if( x.l_start
0390: 3e 6c 77 72 20 29 7b 0a 20 20 20 20 63 6e 74 20 >lwr ){. cnt
03a0: 2b 3d 20 73 68 6f 77 4c 6f 63 6b 73 49 6e 52 61 += showLocksInRa
03b0: 6e 67 65 28 66 64 2c 20 6c 77 72 2c 20 78 2e 6c nge(fd, lwr, x.l
03c0: 5f 73 74 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 20 _start-1);. }.
03d0: 20 69 66 28 20 78 2e 6c 5f 73 74 61 72 74 2b 78 if( x.l_start+x
03e0: 2e 6c 5f 6c 65 6e 3c 75 70 72 20 29 7b 0a 20 20 .l_len<upr ){.
03f0: 20 20 63 6e 74 20 2b 3d 20 73 68 6f 77 4c 6f 63 cnt += showLoc
0400: 6b 73 49 6e 52 61 6e 67 65 28 66 64 2c 20 78 2e ksInRange(fd, x.
0410: 6c 5f 73 74 61 72 74 2b 78 2e 6c 5f 6c 65 6e 2b l_start+x.l_len+
0420: 31 2c 20 75 70 72 29 3b 0a 20 20 7d 0a 20 20 72 1, upr);. }. r
0430: 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 69 6e eturn cnt;.}..in
0440: 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c t main(int argc,
0450: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 char **argv){.
0460: 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74 20 63 int fd;. int c
0470: 6e 74 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 nt;.. if( argc!
0480: 3d 32 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 =2 ){. fprint
0490: 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 f(stderr, "Usage
04a0: 3a 20 25 73 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 : %s FILENAME\n"
04b0: 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 , argv[0]);.
04c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 return 1;. }.
04d0: 66 64 20 3d 20 6f 70 65 6e 28 61 72 67 76 5b 31 fd = open(argv[1
04e0: 5d 2c 20 4f 5f 52 44 57 52 2c 20 30 29 3b 0a 20 ], O_RDWR, 0);.
04f0: 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 if( fd<0 ){.
0500: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c fprintf(stderr,
0510: 20 22 25 73 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 "%s: cannot ope
0520: 6e 20 25 73 5c 6e 22 2c 20 61 72 67 76 5b 30 5d n %s\n", argv[0]
0530: 2c 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 , argv[1]);.
0540: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 return 1;. }.
0550: 63 6e 74 20 3d 20 73 68 6f 77 4c 6f 63 6b 73 49 cnt = showLocksI
0560: 6e 52 61 6e 67 65 28 66 64 2c 20 30 2c 20 4d 58 nRange(fd, 0, MX
0570: 5f 4c 43 4b 29 3b 0a 20 20 69 66 28 20 63 6e 74 _LCK);. if( cnt
0580: 3d 3d 30 20 29 20 70 72 69 6e 74 66 28 22 6e 6f ==0 ) printf("no
0590: 20 6c 6f 63 6b 73 5c 6e 22 29 3b 20 20 0a 20 20 locks\n"); .
05a0: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 72 65 74 close(fd);. ret
05b0: 75 72 6e 20 30 3b 0a 7d 0a urn 0;.}.