/ Hex Artifact Content
Login

Artifact f4c39b651370156cae979501a7b156bdba50e7ce:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 75 74 69 6c 69  /*.** This utili
0010: 74 79 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 73  ty program looks
0020: 20 61 74 20 61 6e 20 53 51 4c 69 74 65 20 64 61   at an SQLite da
0030: 74 61 62 61 73 65 20 61 6e 64 20 64 65 74 65 72  tabase and deter
0040: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 0a 2a 2a  mines whether.**
0050: 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 6c 6f   or not it is lo
0060: 63 6b 65 64 2c 20 74 68 65 20 6b 69 6e 64 20 6f  cked, the kind o
0070: 66 20 6c 6f 63 6b 2c 20 61 6e 64 20 77 68 6f 20  f lock, and who 
0080: 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 69 73 20  is holding this 
0090: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lock..**.** This
00a0: 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 75   only works on u
00b0: 6e 69 78 20 77 68 65 6e 20 74 68 65 20 70 6f 73  nix when the pos
00c0: 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
00d0: 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 75 73  ing method is us
00e0: 65 64 0a 2a 2a 20 28 77 68 69 63 68 20 69 73 20  ed.** (which is 
00f0: 74 68 65 20 64 65 66 61 75 6c 74 20 6f 6e 20 75  the default on u
0100: 6e 69 78 29 20 61 6e 64 20 77 68 65 6e 20 74 68  nix) and when th
0110: 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69  e PENDING_BYTE i
0120: 73 20 69 6e 20 69 74 73 0a 2a 2a 20 75 73 75 61  s in its.** usua
0130: 6c 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69 6e 63  l place..*/.#inc
0140: 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e  lude <sys/types.
0150: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0160: 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  /stat.h>.#includ
0170: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e  e <unistd.h>.#in
0180: 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a  clude <fcntl.h>.
0190: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
01a0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
01b0: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dio.h>.#include 
01c0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
01d0: 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a 73  ude <errno.h>..s
01e0: 74 61 74 69 63 20 76 6f 69 64 20 75 73 61 67 65  tatic void usage
01f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 72 67  (const char *arg
0200: 76 30 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73  v0){.  fprintf(s
0210: 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 25  tderr, "Usage: %
0220: 73 20 64 61 74 61 62 61 73 65 5c 6e 22 2c 20 61  s database\n", a
0230: 72 67 76 30 29 3b 0a 20 20 65 78 69 74 28 31 29  rgv0);.  exit(1)
0240: 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 66 6f  ;.}../* Check fo
0250: 72 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  r a conflicting 
0260: 6c 6f 63 6b 2e 20 20 49 66 20 6f 6e 65 20 69 73  lock.  If one is
0270: 20 66 6f 75 6e 64 2c 20 70 72 69 6e 74 20 61 6e   found, print an
0280: 20 74 68 69 73 0a 2a 2a 20 6f 6e 20 73 74 61 6e   this.** on stan
0290: 64 61 72 64 20 6f 75 74 70 75 74 20 75 73 69 6e  dard output usin
02a0: 67 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72  g the format str
02b0: 69 6e 67 20 67 69 76 65 6e 20 61 6e 64 20 72 65  ing given and re
02c0: 74 75 72 6e 20 31 2e 0a 2a 2a 20 49 66 20 74 68  turn 1..** If th
02d0: 65 72 65 20 61 72 65 20 6e 6f 20 63 6f 6e 66 6c  ere are no confl
02e0: 69 63 74 69 6e 67 20 6c 6f 63 6b 73 2c 20 72 65  icting locks, re
02f0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
0300: 63 20 69 6e 74 20 69 73 4c 6f 63 6b 65 64 28 0a  c int isLocked(.
0310: 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
0320: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
0330: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 68  descriptor to ch
0340: 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 74 79 70  eck */.  int typ
0350: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
0360: 2a 20 46 5f 52 44 4c 43 4b 20 6f 72 20 46 5f 57  * F_RDLCK or F_W
0370: 52 4c 43 4b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  RLCK */.  unsign
0380: 65 64 20 69 6e 74 20 69 4f 66 73 74 2c 20 20 20  ed int iOfst,   
0390: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
03a0: 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   the lock */.  u
03b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 43 6e 74  nsigned int iCnt
03c0: 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ,    /* Number o
03d0: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  f bytes in the l
03e0: 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 63  ock range */.  c
03f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
0400: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
0410: 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
0420: 75 63 74 20 66 6c 6f 63 6b 20 6c 6b 3b 0a 0a 20  uct flock lk;.. 
0430: 20 6d 65 6d 73 65 74 28 26 6c 6b 2c 20 30 2c 20   memset(&lk, 0, 
0440: 73 69 7a 65 6f 66 28 6c 6b 29 29 3b 0a 20 20 6c  sizeof(lk));.  l
0450: 6b 2e 6c 5f 74 79 70 65 20 3d 20 74 79 70 65 3b  k.l_type = type;
0460: 0a 20 20 6c 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d  .  lk.l_whence =
0470: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6b 2e   SEEK_SET;.  lk.
0480: 6c 5f 73 74 61 72 74 20 3d 20 69 4f 66 73 74 3b  l_start = iOfst;
0490: 0a 20 20 6c 6b 2e 6c 5f 6c 65 6e 20 3d 20 69 43  .  lk.l_len = iC
04a0: 6e 74 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c 28  nt;.  if( fcntl(
04b0: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29  h, F_GETLK, &lk)
04c0: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 66 70  ==(-1) ){.    fp
04d0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
04e0: 63 6e 74 6c 28 25 64 29 20 66 61 69 6c 65 64 3a  cntl(%d) failed:
04f0: 20 65 72 72 6e 6f 3d 25 64 5c 6e 22 2c 20 68 2c   errno=%d\n", h,
0500: 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 65 78 69   errno);.    exi
0510: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  t(1);.  }.  if( 
0520: 6c 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  lk.l_type==F_UNL
0530: 43 4b 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  CK ) return 0;. 
0540: 20 70 72 69 6e 74 66 28 22 25 73 20 6c 6f 63 6b   printf("%s lock
0550: 20 68 65 6c 64 20 62 79 20 25 64 5c 6e 22 2c 20   held by %d\n", 
0560: 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 6b 2e 6c  zType, (int)lk.l
0570: 5f 70 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  _pid);.  return 
0580: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  1;.}../*.** Loca
0590: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 69 6e 67 20  tion of locking 
05a0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 64 61 74  bytes in the dat
05b0: 61 62 61 73 65 20 66 69 6c 65 0a 2a 2f 0a 23 64  abase file.*/.#d
05c0: 65 66 69 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59  efine PENDING_BY
05d0: 54 45 20 20 20 20 20 20 28 30 78 34 30 30 30 30  TE      (0x40000
05e0: 30 30 30 29 0a 23 64 65 66 69 6e 65 20 52 45 53  000).#define RES
05f0: 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 28  ERVED_BYTE     (
0600: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 29 0a  PENDING_BYTE+1).
0610: 23 64 65 66 69 6e 65 20 53 48 41 52 45 44 5f 46  #define SHARED_F
0620: 49 52 53 54 20 20 20 20 20 20 28 50 45 4e 44 49  IRST      (PENDI
0630: 4e 47 5f 42 59 54 45 2b 32 29 0a 23 64 65 66 69  NG_BYTE+2).#defi
0640: 6e 65 20 53 48 41 52 45 44 5f 53 49 5a 45 20 20  ne SHARED_SIZE  
0650: 20 20 20 20 20 35 31 30 0a 0a 2f 2a 0a 2a 2a 20       510../*.** 
0660: 4c 6f 63 6b 20 6c 6f 63 61 74 69 6f 6e 73 20 66  Lock locations f
0670: 6f 72 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  or shared-memory
0680: 20 6c 6f 63 6b 73 20 75 73 65 64 20 62 79 20 57   locks used by W
0690: 41 4c 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66  AL mode..*/.#def
06a0: 69 6e 65 20 53 48 4d 5f 42 41 53 45 20 20 20 20  ine SHM_BASE    
06b0: 20 20 20 20 20 20 31 32 30 0a 23 64 65 66 69 6e        120.#defin
06c0: 65 20 53 48 4d 5f 57 52 49 54 45 20 20 20 20 20  e SHM_WRITE     
06d0: 20 20 20 20 53 48 4d 5f 42 41 53 45 0a 23 64 65      SHM_BASE.#de
06e0: 66 69 6e 65 20 53 48 4d 5f 43 48 45 43 4b 50 4f  fine SHM_CHECKPO
06f0: 49 4e 54 20 20 20 20 28 53 48 4d 5f 42 41 53 45  INT    (SHM_BASE
0700: 2b 31 29 0a 23 64 65 66 69 6e 65 20 53 48 4d 5f  +1).#define SHM_
0710: 52 45 43 4f 56 45 52 20 20 20 20 20 20 20 28 53  RECOVER       (S
0720: 48 4d 5f 42 41 53 45 2b 32 29 0a 23 64 65 66 69  HM_BASE+2).#defi
0730: 6e 65 20 53 48 4d 5f 52 45 41 44 5f 46 49 52 53  ne SHM_READ_FIRS
0740: 54 20 20 20 20 28 53 48 4d 5f 42 41 53 45 2b 33  T    (SHM_BASE+3
0750: 29 0a 23 64 65 66 69 6e 65 20 53 48 4d 5f 52 45  ).#define SHM_RE
0760: 41 44 5f 53 49 5a 45 20 20 20 20 20 35 0a 0a 0a  AD_SIZE     5...
0770: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
0780: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
0790: 0a 20 20 69 6e 74 20 68 44 62 3b 20 20 20 20 20  .  int hDb;     
07a0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
07b0: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6f 70  iptor for the op
07c0: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
07d0: 20 2a 2f 0a 20 20 69 6e 74 20 68 53 68 6d 3b 20   */.  int hShm; 
07e0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
07f0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 57 41 4c  scriptor for WAL
0800: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
0810: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
0820: 53 68 6d 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  Shm;     /* Name
0830: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   of the shared-m
0840: 65 6d 6f 72 79 20 66 69 6c 65 20 66 6f 72 20 57  emory file for W
0850: 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 73 73 69  AL mode */.  ssi
0860: 7a 65 5f 74 20 67 6f 74 3b 20 20 20 20 2f 2a 20  ze_t got;    /* 
0870: 42 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  Bytes read from 
0880: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
0890: 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  isWal;          
08a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
08b0: 66 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  f in WAL mode */
08c0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
08e0: 20 4c 65 6e 67 74 68 20 6f 66 20 66 69 6c 65 6e   Length of filen
08f0: 61 6d 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ame */.  unsigne
0900: 64 20 63 68 61 72 20 61 48 64 72 5b 31 30 30 5d  d char aHdr[100]
0910: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
0920: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
0930: 6e 4c 6f 63 6b 20 3d 20 30 3b 20 20 20 20 20 20  nLock = 0;      
0940: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0950: 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a   of locks held *
0960: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0980: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
0990: 2f 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  /..  if( argc!=2
09a0: 20 29 20 75 73 61 67 65 28 61 72 67 76 5b 30 5d   ) usage(argv[0]
09b0: 29 3b 0a 20 20 68 44 62 20 3d 20 6f 70 65 6e 28  );.  hDb = open(
09c0: 61 72 67 76 5b 31 5d 2c 20 4f 5f 52 44 4f 4e 4c  argv[1], O_RDONL
09d0: 59 2c 20 30 29 3b 0a 20 20 69 66 28 20 68 44 62  Y, 0);.  if( hDb
09e0: 3c 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  <0 ){.    fprint
09f0: 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f  f(stderr, "canno
0a00: 74 20 6f 70 65 6e 20 25 73 5c 6e 22 2c 20 61 72  t open %s\n", ar
0a10: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 72 65 74 75  gv[1]);.    retu
0a20: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
0a30: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 61 72 65  Make sure we are
0a40: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
0a50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
0a60: 2f 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 68  /.  got = read(h
0a70: 44 62 2c 20 61 48 64 72 2c 20 31 30 30 29 3b 0a  Db, aHdr, 100);.
0a80: 20 20 69 66 28 20 67 6f 74 21 3d 31 30 30 20 7c    if( got!=100 |
0a90: 7c 20 6d 65 6d 63 6d 70 28 61 48 64 72 2c 20 22  | memcmp(aHdr, "
0aa0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 22  SQLite format 3"
0ab0: 2c 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 66  ,16)!=0 ){.    f
0ac0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
0ad0: 6e 6f 74 20 61 6e 20 53 51 4c 69 74 65 20 64 61  not an SQLite da
0ae0: 74 61 62 61 73 65 3a 20 25 73 5c 6e 22 2c 20 61  tabase: %s\n", a
0af0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 78 69  rgv[1]);.    exi
0b00: 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  t(1);.  }..  /* 
0b10: 46 69 72 73 74 20 63 68 65 63 6b 20 66 6f 72 20  First check for 
0b20: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
0b30: 6b 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 6f 63  k */.  if( isLoc
0b40: 6b 65 64 28 68 44 62 2c 20 46 5f 52 44 4c 43 4b  ked(hDb, F_RDLCK
0b50: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
0b60: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 22 45 58  SHARED_SIZE, "EX
0b70: 43 4c 55 53 49 56 45 22 29 20 29 7b 0a 20 20 20  CLUSIVE") ){.   
0b80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
0b90: 20 69 73 57 61 6c 20 3d 20 61 48 64 72 5b 31 38   isWal = aHdr[18
0ba0: 5d 3d 3d 32 3b 0a 20 20 69 66 28 20 69 73 57 61  ]==2;.  if( isWa
0bb0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52  l==0 ){.    /* R
0bc0: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 2a 2f 0a  ollback mode */.
0bd0: 20 20 20 20 69 66 28 20 69 73 4c 6f 63 6b 65 64      if( isLocked
0be0: 28 68 44 62 2c 20 46 5f 52 44 4c 43 4b 2c 20 50  (hDb, F_RDLCK, P
0bf0: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
0c00: 22 50 45 4e 44 49 4e 47 22 29 20 29 20 72 65 74  "PENDING") ) ret
0c10: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 69  urn 0;.    if( i
0c20: 73 4c 6f 63 6b 65 64 28 68 44 62 2c 20 46 5f 52  sLocked(hDb, F_R
0c30: 44 4c 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 42  DLCK, RESERVED_B
0c40: 59 54 45 2c 20 31 2c 20 22 52 45 53 45 52 56 45  YTE, 1, "RESERVE
0c50: 44 22 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  D") ) return 0;.
0c60: 20 20 20 20 69 66 28 20 69 73 4c 6f 63 6b 65 64      if( isLocked
0c70: 28 68 44 62 2c 20 46 5f 57 52 4c 43 4b 2c 20 53  (hDb, F_WRLCK, S
0c80: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41  HARED_FIRST, SHA
0c90: 52 45 44 5f 53 49 5a 45 2c 20 22 53 48 41 52 45  RED_SIZE, "SHARE
0ca0: 44 22 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  D") ){.      ret
0cb0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
0cc0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 41 4c  else{.    /* WAL
0cd0: 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6e 4e 61   mode */.    nNa
0ce0: 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
0cf0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 7a  (argv[1]);.    z
0d00: 53 68 6d 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4e  Shm = malloc( nN
0d10: 61 6d 65 20 2b 20 31 30 30 20 29 3b 0a 20 20 20  ame + 100 );.   
0d20: 20 69 66 28 20 7a 53 68 6d 3d 3d 30 20 29 7b 0a   if( zShm==0 ){.
0d30: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
0d40: 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65  derr, "out of me
0d50: 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
0d60: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
0d70: 20 20 20 6d 65 6d 63 70 79 28 7a 53 68 6d 2c 20     memcpy(zShm, 
0d80: 61 72 67 76 5b 31 5d 2c 20 6e 4e 61 6d 65 29 3b  argv[1], nName);
0d90: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 68  .    memcpy(&zSh
0da0: 6d 5b 6e 4e 61 6d 65 5d 2c 20 22 2d 73 68 6d 22  m[nName], "-shm"
0db0: 2c 20 35 29 3b 0a 20 20 20 20 68 53 68 6d 20 3d  , 5);.    hShm =
0dc0: 20 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44   open(zShm, O_RD
0dd0: 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  ONLY, 0);.    if
0de0: 28 20 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20 20  ( hShm<0 ){.    
0df0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
0e00: 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 25  , "cannot open %
0e10: 73 5c 6e 22 2c 20 7a 53 68 6d 29 3b 0a 20 20 20  s\n", zShm);.   
0e20: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
0e30: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4c 6f 63   }.    if( isLoc
0e40: 6b 65 64 28 68 53 68 6d 2c 20 46 5f 52 44 4c 43  ked(hShm, F_RDLC
0e50: 4b 2c 20 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20  K, SHM_RECOVER, 
0e60: 31 2c 20 22 57 41 4c 2d 52 45 43 4f 56 45 52 59  1, "WAL-RECOVERY
0e70: 22 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ") ){.      retu
0e80: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
0e90: 6e 4c 6f 63 6b 20 2b 3d 20 69 73 4c 6f 63 6b 65  nLock += isLocke
0ea0: 64 28 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c  d(hShm, F_RDLCK,
0eb0: 20 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 2c   SHM_CHECKPOINT,
0ec0: 20 31 2c 20 22 57 41 4c 2d 43 48 45 43 4b 50 4f   1, "WAL-CHECKPO
0ed0: 49 4e 54 22 29 3b 0a 20 20 20 20 6e 4c 6f 63 6b  INT");.    nLock
0ee0: 20 2b 3d 20 69 73 4c 6f 63 6b 65 64 28 68 53 68   += isLocked(hSh
0ef0: 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f  m, F_RDLCK, SHM_
0f00: 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d 57  WRITE, 1, "WAL-W
0f10: 52 49 54 45 22 29 3b 0a 20 20 20 20 66 6f 72 28  RITE");.    for(
0f20: 69 3d 30 3b 20 69 3c 53 48 4d 5f 52 45 41 44 5f  i=0; i<SHM_READ_
0f30: 53 49 5a 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  SIZE; i++){.    
0f40: 20 20 6e 4c 6f 63 6b 20 2b 3d 20 69 73 4c 6f 63    nLock += isLoc
0f50: 6b 65 64 28 68 53 68 6d 2c 20 46 5f 57 52 4c 43  ked(hShm, F_WRLC
0f60: 4b 2c 20 53 48 4d 5f 52 45 41 44 5f 46 49 52 53  K, SHM_READ_FIRS
0f70: 54 2b 69 2c 20 31 2c 20 22 57 41 4c 2d 52 45 41  T+i, 1, "WAL-REA
0f80: 44 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  D");.    }.  }. 
0f90: 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d 30 20 29 7b   if( nLock==0 ){
0fa0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 66 69 6c  .    printf("fil
0fb0: 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 5c  e is not locked\
0fc0: 6e 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n");.  }.  retur
0fd0: 6e 20 30 3b 0a 7d 0a                             n 0;.}.