/ Hex Artifact Content
Login

Artifact 9920bcc64f58378ff1118caead34147201f48c68:


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;.}.