/ Hex Artifact Content
Login

Artifact dabbe23efc9de8fb30caad63f73c88e10ab0499e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  .h>.# if OS_VXWO
11b0: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
11c0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
11e0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
11f0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
1200: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1210: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
1220: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1230: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1240: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1260: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
1270: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1280: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
1290: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
12a0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
12b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  if../*.** Allowe
12c0: 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78  d values of unix
12d0: 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a  File.fsFlags.*/.
12e0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46  #define SQLITE_F
12f0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20  SFLAGS_IS_MSDOS 
1300: 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49      0x1../*.** I
1310: 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74  f we are to be t
1320: 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c  hread-safe, incl
1330: 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73  ude the pthreads
1340: 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69   header and defi
1350: 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ne.** the SQLITE
1360: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61  _UNIX_THREADS ma
1370: 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  cro..*/.#if SQLI
1380: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20  TE_THREADSAFE.# 
1390: 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64  include <pthread
13a0: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .h>.# define SQL
13b0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
13c0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
13d0: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
13e0: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
13f0: 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f  ng a new file.*/
1400: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1410: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
1420: 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e  MISSIONS.# defin
1430: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
1440: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1450: 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f  S 0644.#endif../
1460: 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  *. ** Default pe
1470: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1480: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1490: 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64  xy dir. */.#ifnd
14a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
14b0: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
14c0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
14d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
14e0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
14f0: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
1500: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
1510: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
1520: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
1530: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
1540: 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  2../*.** Only se
1550: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
1560: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
1570: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
1580: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
1590: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
15a0: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
15b0: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
15c0: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
15d0: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
15e0: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
15f0: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
1600: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
1610: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1620: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
1630: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
1640: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
1650: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1660: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
1670: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
1680: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1690: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
16a0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
16b0: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
16c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
16d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
16e0: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
16f0: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
1700: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
1710: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
1720: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
1730: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
1740: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
1750: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
1760: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
1770: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
1780: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
1790: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
17a0: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
17b0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
17c0: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
17d0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
17e0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
17f0: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
1800: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
1810: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
1820: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
1830: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
1840: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1850: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
1860: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
1870: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
18a0: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
18b0: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
18c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
18d0: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
18e0: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
18f0: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
1900: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
1910: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
1920: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1930: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
1940: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
1950: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1960: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1970: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1980: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1990: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
19a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
19b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
19c0: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
19d0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
19e0: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
19f0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
1a00: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
1a10: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
1a20: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69  t entry */.  uni
1a30: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1a40: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
1a50: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c   /* Info about l
1a60: 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f  ocks on this ino
1a70: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  de */.  int h;  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1aa0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1ab0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  or */.  int dirf
1ac0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ae0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
1af0: 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  or the directory
1b00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1b10: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b30: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b40: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b60: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b70: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b80: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b90: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1ba0: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bd0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1be0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bf0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1c00: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1c10: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c20: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c30: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c40: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c60: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c70: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c90: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1ca0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1cb0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cc0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cf0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1d00: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d10: 72 65 61 64 4f 6e 6c 79 53 68 6d 3b 20 20 20 20  readOnlyShm;    
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 2f 2a 20 54 72 75 65 20 74 6f 20 6f 70 65 6e 20  /* True to open 
1d40: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1d50: 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  ad-only */.  int
1d60: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62   /* Configured b
1d90: 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  y FCNTL_CHUNK_SI
1da0: 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ZE */.#if SQLITE
1db0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dc0: 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e  STYLE.  int open
1dd0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1df0: 68 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69  he flags specifi
1e00: 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed at open() */.
1e10: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1e20: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1e30: 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65  _STYLE || define
1e40: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75  d(__APPLE__).  u
1e50: 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b  nsigned fsFlags;
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74     /* cached det
1e80: 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73  ails from statfs
1e90: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  () */.#endif.#if
1ea0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e   OS_VXWORKS.  in
1eb0: 74 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20  t isDelete;     
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
1ee0: 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a  lose if true */.
1ef0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1f00: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1f10: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1f20: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1f30: 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  f.#ifndef NDEBUG
1f40: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67  .  /* The next g
1f50: 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65  roup of variable
1f60: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72  s are used to tr
1f70: 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ack whether or n
1f80: 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  ot the.  ** tran
1f90: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1fa0: 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f  in bytes 24-27 o
1fb0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  f database files
1fc0: 20 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a   are updated.  *
1fd0: 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70  * whenever any p
1fe0: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
1ff0: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e  ase changes.  An
2000: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74   assertion fault
2010: 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72   will.  ** occur
2020: 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70   if a file is up
2030: 64 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c  dated without al
2040: 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20  so updating the 
2050: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
2060: 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
2070: 74 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20  test is made to 
2080: 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65  avoid new proble
2090: 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  ms similar to th
20a0: 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72  e.  ** one descr
20b0: 69 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23  ibed by ticket #
20c0: 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e  3584. .  */.  un
20d0: 73 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e  signed char tran
20e0: 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20  sCntrChng;   /* 
20f0: 54 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e  True if the tran
2100: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
2110: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2120: 69 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64  igned char dbUpd
2130: 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ate;        /* T
2140: 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20  rue if any part 
2150: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
2160: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e   changed */.  un
2170: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f  signed char inNo
2180: 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20  rmalWrite;   /* 
2190: 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72  True if in a nor
21a0: 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74  mal write operat
21b0: 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ion */.#endif.#i
21c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
21d0: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
21e0: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
21f0: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
2200: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
2210: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
2220: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
2230: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
2240: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
2250: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
2260: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
2270: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
2280: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
2290: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c   for the unixFil
22a0: 65 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d  e.ctrlFlags bitm
22b0: 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask:.*/.#define 
22c0: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20  UNIXFILE_EXCL   
22d0: 30 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  0x01     /* Conn
22e0: 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65  ections from one
22f0: 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f   process only */
2300: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2310: 45 5f 52 44 4f 4e 4c 59 20 30 78 30 32 20 20 20  E_RDONLY 0x02   
2320: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
2330: 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a  is read only */.
2340: 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63  ./*.** Include c
2350: 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d  ode that is comm
2360: 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63  on to all os_*.c
2370: 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75   files.*/.#inclu
2380: 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22  de "os_common.h"
2390: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
23a0: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
23b0: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
23c0: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
23d0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
23e0: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
23f0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
2400: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2410: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
2420: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
2430: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
2440: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
2450: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
2460: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
2470: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
2480: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
2490: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
24a0: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
24b0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
24c0: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
24d0: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
24e0: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
24f0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
2500: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
2510: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
2520: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
2530: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
2540: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2550: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2560: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  adid 0.#endif../
2570: 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 55  *.** Different U
2580: 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65 63 6c  nix systems decl
2590: 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20 64 69  are open() in di
25a0: 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20 20 53  fferent ways.  S
25b0: 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28  ame use.** open(
25c0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
25d0: 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65 72 73  mode_t).  Others
25e0: 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20   use open(const 
25f0: 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a  char*,int,...)..
2600: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2610: 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 77  e is important w
2620: 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f 69 6e  hen using a poin
2630: 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ter to the funct
2640: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
2650: 61 66 65 73 74 20 77 61 79 20 74 6f 20 64 65 61  afest way to dea
2660: 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f 62 6c  l with the probl
2670: 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79 73 20  em is to always 
2680: 75 73 65 20 74 68 69 73 20 77 72 61 70 70 65 72  use this wrapper
2690: 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61 79 73  .** which always
26a0: 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 77 65   has the same we
26b0: 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74 65 72  ll-defined inter
26c0: 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  face..*/.static 
26d0: 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f  int posixOpen(co
26e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c  nst char *zFile,
26f0: 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20   int flags, int 
2700: 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  mode){.  return 
2710: 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67  open(zFile, flag
2720: 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a  s, mode);.}../*.
2730: 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63  ** Many system c
2740: 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65  alls are accesse
2750: 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65  d through pointe
2760: 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73  r-to-functions s
2770: 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d  o that.** they m
2780: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
2790: 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66   at runtime to f
27a0: 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20  acilitate fault 
27b0: 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67  injection during
27c0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
27d0: 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65  sandboxing.  The
27e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
27f0: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73   holds the names
2800: 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a   and pointers.**
2810: 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65   to all override
2820: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
2830: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  s..*/.static str
2840: 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c  uct unix_syscall
2850: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
2860: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
2870: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2880: 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a  e sytem call */.
2890: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
28a0: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
28b0: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
28c0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
28d0: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
28e0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
28f0: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
2900: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
2910: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20  scall[] = {.  { 
2920: 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20  "open",         
2930: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2940: 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20  _ptr)posixOpen, 
2950: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2960: 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74  sOpen      ((int
2970: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
2980: 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c  int,int))aSyscal
2990: 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[0].pCurrent)..
29a0: 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20    { "close",    
29b0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
29c0: 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20  call_ptr)close, 
29d0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
29e0: 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28  ne osClose     (
29f0: 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79  (int(*)(int))aSy
2a00: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
2a10: 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22  t)..  { "access"
2a20: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
2a30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63  _syscall_ptr)acc
2a40: 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ess,     0  },.#
2a50: 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20  define osAccess 
2a60: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2a70: 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79  t char*,int))aSy
2a80: 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e  scall[2].pCurren
2a90: 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22  t)..  { "getcwd"
2aa0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
2ab0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74  _syscall_ptr)get
2ac0: 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  cwd,     0  },.#
2ad0: 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20  define osGetcwd 
2ae0: 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68     ((char*(*)(ch
2af0: 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  ar*,size_t))aSys
2b00: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
2b10: 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20  )..  { "stat",  
2b20: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2b30: 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74  syscall_ptr)stat
2b40: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
2b50: 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20  efine osStat    
2b60: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2b70: 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74   char*,struct st
2b80: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d  at*))aSyscall[4]
2b90: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a  .pCurrent)../*.*
2ba0: 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70  * The DJGPP comp
2bb0: 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  iler environment
2bc0: 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69   looks mostly li
2bd0: 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a  ke Unix, but it.
2be0: 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e  ** lacks the fcn
2bf0: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
2c00: 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66  .  So redefine f
2c10: 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d  cntl() to be som
2c20: 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61  ething.** that a
2c30: 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
2c40: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
2c50: 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f   locking does no
2c60: 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a  t occur under.**
2c70: 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20   DJGPP.  But it 
2c80: 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69  is DOS - what di
2c90: 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f  d you expect?.*/
2ca0: 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f  .#ifdef __DJGPP_
2cb0: 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20  _.  { "fstat",  
2cc0: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
2cd0: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
2ce0: 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61  define osFstat(a
2cf0: 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65  ,b,c)    0.#else
2d00: 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74       .  { "fstat
2d10: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
2d20: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
2d30: 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c  stat,      0  },
2d40: 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74  .#define osFstat
2d50: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
2d60: 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  t,struct stat*))
2d70: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
2d80: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20  rent).#endif..  
2d90: 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20  { "ftruncate",  
2da0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
2db0: 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65  ll_ptr)ftruncate
2dc0: 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65  ,  0  },.#define
2dd0: 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69   osFtruncate ((i
2de0: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29  nt(*)(int,off_t)
2df0: 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75  )aSyscall[6].pCu
2e00: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e  rrent)..  { "fcn
2e10: 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  tl",        (sql
2e20: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2e30: 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20  )fcntl,      0  
2e40: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e  },.#define osFcn
2e50: 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  tl     ((int(*)(
2e60: 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79  int,int,...))aSy
2e70: 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e  scall[7].pCurren
2e80: 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20  t)..  { "read", 
2e90: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2ea0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61  _syscall_ptr)rea
2eb0: 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  d,       0  },.#
2ec0: 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20  define osRead   
2ed0: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
2ee0: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
2ef0: 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43  ))aSyscall[8].pC
2f00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
2f10: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
2f20: 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
2f30: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2f40: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
2f50: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2f60: 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20  all_ptr)pread,  
2f70: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a      0  },.#else.
2f80: 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20    { "pread",    
2f90: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2fa0: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
2fb0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
2fc0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61  f.#define osPrea
2fd0: 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28  d     ((ssize_t(
2fe0: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
2ff0: 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  e_t,off_t))aSysc
3000: 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29  all[9].pCurrent)
3010: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
3020: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22  E_PREAD64).  { "
3030: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3040: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3050: 70 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20  ptr)pread64,    
3060: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3070: 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20  "pread64",      
3080: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3090: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
30a0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
30b0: 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20  efine osPread64 
30c0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
30d0: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  nt,void*,size_t,
30e0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
30f0: 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  10].pCurrent).. 
3100: 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20   { "write",     
3110: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3120: 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20  all_ptr)write,  
3130: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3140: 65 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28  e osWrite     ((
3150: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3160: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3170: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e  t))aSyscall[11].
3180: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3190: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
31a0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
31b0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
31c0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
31d0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
31e0: 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65  scall_ptr)pwrite
31f0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  ,     0  },.#els
3200: 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20  e.  { "pwrite", 
3210: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3220: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3230: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3240: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77  dif.#define osPw
3250: 72 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f  rite    ((ssize_
3260: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3270: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
3280: 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  t))\.           
3290: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
32a0: 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[12].pCurrent).
32b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
32c0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
32d0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
32e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
32f0: 74 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30  tr)pwrite64,   0
3300: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3310: 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28  pwrite64",     (
3320: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3330: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3340: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3350: 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20  fine osPwrite64 
3360: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3370: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
3380: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20  ze_t,off_t))\.  
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70    aSyscall[13].p
33b0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
33c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
33d0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66  ING_STYLE.  { "f
33e0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
33f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3400: 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30  tr)fchmod,     0
3410: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3420: 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28  fchmod",       (
3430: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3440: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3450: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3460: 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20  fine osFchmod   
3470: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f   ((int(*)(int,mo
3480: 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  de_t))aSyscall[1
3490: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
34a0: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  f defined(HAVE_P
34b0: 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20  OSIX_FALLOCATE) 
34c0: 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  && HAVE_POSIX_FA
34d0: 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c  LLOCATE.  { "fal
34e0: 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  locate",    (sql
34f0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3500: 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65  )posix_fallocate
3510: 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  ,  0 },.#else.  
3520: 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20  { "fallocate",  
3530: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3540: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3550: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3560: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46  ndif.#define osF
3570: 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a  allocate ((int(*
3580: 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f  )(int,off_t,off_
3590: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e  t))aSyscall[15].
35a0: 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a  pCurrent)..}; /*
35b0: 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   End of the over
35c0: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
35d0: 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  calls */../*.** 
35e0: 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74  This is the xSet
35f0: 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74  SystemCall() met
3600: 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  hod of sqlite3_v
3610: 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  fs for all of th
3620: 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65  e.** "unix" VFSe
3630: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
3640: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
3650: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
3660: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
3670: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
3680: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
3690: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
36a0: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
36b0: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
36c0: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
36d0: 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74   int unixSetSyst
36e0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
36f0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
3700: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
3710: 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74  FS pointer.  Not
3720: 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74   used */.  const
3730: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
3740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3750: 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   of system call 
3760: 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20  to override */. 
3770: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3780: 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f  _ptr pNewFunc  /
3790: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
37a0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c   system call val
37b0: 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
37c0: 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ned int i;.  int
37d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
37e0: 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44  FOUND;..  UNUSED
37f0: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
3800: 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  sed);.  if( zNam
3810: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  e==0 ){.    /* I
3820: 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69  f no zName is gi
3830: 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c  ven, restore all
3840: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f   system calls to
3850: 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20   their default. 
3860: 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61     ** settings a
3870: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20  nd return NULL. 
3880: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
3890: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f  QLITE_OK;.    fo
38a0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
38b0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
38c0: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
38d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
38e0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
38f0: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ult ){.        a
3900: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
3910: 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ent = aSyscall[i
3920: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  ].pDefault;.    
3930: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
3940: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  e{.    /* If zNa
3950: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
3960: 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79   operate on only
3970: 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20   the one system 
3980: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63  call.    ** spec
3990: 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ified..    */.  
39a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
39b0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
39c0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
39d0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
39e0: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
39f0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
3a00: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
3a10: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
3a20: 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b  ].pDefault==0 ){
3a30: 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63  .          aSysc
3a40: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
3a50: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  = aSyscall[i].pC
3a60: 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  urrent;.        
3a70: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  }.        rc = S
3a80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
3a90: 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d    if( pNewFunc==
3aa0: 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61  0 ) pNewFunc = a
3ab0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
3ac0: 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79  ult;.        aSy
3ad0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
3ae0: 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20  t = pNewFunc;.  
3af0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
3b10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3b20: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
3b30: 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65  value of a syste
3b40: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
3b50: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73  NULL if zName is
3b60: 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e   not a.** recogn
3b70: 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c  ized system call
3b80: 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20   name.  NULL is 
3b90: 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
3ba0: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
3bb0: 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
3bc0: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
3bd0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79  tatic sqlite3_sy
3be0: 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65  scall_ptr unixGe
3bf0: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
3c00: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
3c10: 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Used,.  const ch
3c20: 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75  ar *zName.){.  u
3c30: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a  nsigned int i;..
3c40: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3c50: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
3c60: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
3c70: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
3c80: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
3c90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
3ca0: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
3cb0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
3cc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
3cd0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
3ce0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
3cf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3d00: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
3d10: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
3d20: 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e  all after zName.
3d30: 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c    If zName==NULL
3d40: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
3d50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
3d60: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
3d70: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
3d80: 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74  if zName.** is t
3d90: 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63  he last system c
3da0: 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20  all or if zName 
3db0: 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  is not the name 
3dc0: 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79  of a valid.** sy
3dd0: 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74  stem call..*/.st
3de0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3df0: 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43  *unixNextSystemC
3e00: 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20  all(sqlite3_vfs 
3e10: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
3e20: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20  zName){.  int i 
3e30: 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  = -1;..  UNUSED_
3e40: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
3e50: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
3e60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
3e70: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d  ySize(aSyscall)-
3e80: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  1; i++){.      i
3e90: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
3ea0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
3eb0: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
3ec0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
3ed0: 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i++; i<ArraySize
3ee0: 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29  (aSyscall); i++)
3ef0: 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61  {.    if( aSysca
3f00: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d  ll[i].pCurrent!=
3f10: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
3f20: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  all[i].zName;.  
3f30: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 6f 70 65  ./*.** Retry ope
3f50: 6e 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  n() calls that f
3f60: 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52  ail due to EINTR
3f70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
3f80: 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74  obust_open(const
3f90: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c   char *z, int f,
3fa0: 20 69 6e 74 20 6d 29 7b 0a 20 20 69 6e 74 20 72   int m){.  int r
3fb0: 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  c;.  do{ rc = os
3fc0: 4f 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20 7d 77 68  Open(z,f,m); }wh
3fd0: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
3fe0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72  no==EINTR );.  r
3ff0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4000: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
4010: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
4020: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
4030: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
4040: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
4050: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
4060: 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e  otect the unixIn
4070: 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  odeInfo and.** v
4080: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
4090: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
40a0: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
40b0: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
40c0: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
40d0: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
40e0: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
40f0: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
4100: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
4110: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
4120: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
4130: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
4140: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4150: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
4160: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
4170: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
4180: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
4190: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
41a0: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
41b0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
41c0: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
41d0: 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ve().*/.static v
41e0: 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  oid unixEnterMut
41f0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
4200: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
4210: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
4220: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
4230: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
4240: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
4250: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  ixLeaveMutex(voi
4260: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
4270: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
4280: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
4290: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
42a0: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
42b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
42c0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
42d0: 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
42e0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
42f0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
4300: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
4310: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
4320: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
4330: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
4340: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
4350: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
4360: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
4370: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
4380: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
4390: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
43a0: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
43b0: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
43c0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
43d0: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
43e0: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
43f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
4400: 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e  r *azFileLock(in
4410: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
4420: 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63  switch( eFileLoc
4430: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  k ){.    case NO
4440: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
4450: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
4460: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
4470: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
4480: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
4490: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
44a0: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
44b0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
44c0: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
44d0: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
44e0: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
44f0: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
4500: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
4510: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
4520: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
4530: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
4540: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
4550: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
4560: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
4570: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4580: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
4590: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
45a0: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
45b0: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
45c0: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
45d0: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
45e0: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
45f0: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
4600: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
4610: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
4620: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
4630: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
4640: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
4650: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
4660: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
4670: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
4680: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
4690: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
46a0: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
46b0: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
46c0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
46d0: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
46e0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
46f0: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
4700: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
4710: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
4720: 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70  = osFcntl(fd, op
4730: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
4740: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
4750: 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25  ntl unknown %d %
4760: 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c  d %d\n", fd, op,
4770: 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   s);.    return 
4780: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  s;.  }.  if( p->
4790: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
47a0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
47b0: 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  RDLCK";.  }else 
47c0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
47d0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _WRLCK ){.    zT
47e0: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
47f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
4800: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
4810: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e  .    zType = "UN
4820: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LCK";.  }else{. 
4830: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
4840: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
4850: 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f  >l_whence==SEEK_
4860: 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46  SET );.  s = osF
4870: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
4880: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
4890: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
48a0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
48b0: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
48c0: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
48d0: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
48e0: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
48f0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
4900: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
4910: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
4920: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
4930: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
4940: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
4950: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
4960: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
4970: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
4980: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
4990: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73   l2 = *p;.    os
49a0: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  Fcntl(fd, F_GETL
49b0: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
49c0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
49d0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
49e0: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
49f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
4a00: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
4a10: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
4a20: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
4a30: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
4a40: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
4a50: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
4a60: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
4a70: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
4a80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4a90: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4aa0: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
4ab0: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
4ac0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
4ad0: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
4ae0: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
4af0: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
4b00: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
4b10: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
4b20: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64  return s;.}.#und
4b30: 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69  ef osFcntl.#defi
4b40: 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54  ne osFcntl lockT
4b50: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
4b60: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
4b70: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79   */../*.** Retry
4b80: 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c   ftruncate() cal
4b90: 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65  ls that fail due
4ba0: 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61   to EINTR.*/.sta
4bb0: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66  tic int robust_f
4bc0: 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20  truncate(int h, 
4bd0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
4be0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
4bf0: 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63  o{ rc = osFtrunc
4c00: 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c  ate(h,sz); }whil
4c10: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
4c20: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
4c30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4c40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
4c50: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
4c60: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
4c70: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
4c80: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
4c90: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
4ca0: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
4cb0: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
4cc0: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
4cd0: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
4ce0: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
4cf0: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
4d00: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
4d10: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
4d20: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
4d30: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
4d40: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
4d50: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
4d60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
4d70: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
4d80: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
4d90: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
4da0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
4db0: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
4dc0: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
4dd0: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
4de0: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
4df0: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
4e00: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
4e10: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
4e20: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
4e30: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
4e40: 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69  {.  switch (posi
4e50: 78 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a  xError) {.#if 0.
4e60: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    /* At one poin
4e70: 74 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20  t this code was 
4e80: 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  not commented ou
4e90: 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  t. In theory, th
4ea0: 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73  is branch.  ** s
4eb0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68  hould never be h
4ec0: 69 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63  it, as this func
4ed0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
4ee0: 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
4ef0: 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d  .  ** a locking-
4f00: 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  related function
4f10: 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20   (i.e. fcntl()) 
4f20: 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e  has returned non
4f30: 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20  -zero with.  ** 
4f40: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72  the value of err
4f50: 6e 6f 20 61 73 20 74 68 65 20 66 69 72 73 74 20  no as the first 
4f60: 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20  argument. Since 
4f70: 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61  a system call ha
4f80: 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65  s failed,.  ** e
4f90: 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e  rrno should be n
4fa0: 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  on-zero..  **.  
4fb0: 2a 2a 20 44 65 73 70 69 74 65 20 74 68 69 73 2c  ** Despite this,
4fc0: 20 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79   if errno really
4fd0: 20 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69   is zero, we sti
4fe0: 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  ll don't want to
4ff0: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
5000: 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74  ITE_OK. The syst
5010: 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20  em call failed, 
5020: 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74  and *some* SQLit
5030: 65 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62  e error should b
5040: 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65  e.  ** propagate
5050: 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61  d back to the ca
5060: 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67  ller. Commenting
5070: 20 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74   this branch out
5080: 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a   means errno==0.
5090: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e    ** will be han
50a0: 64 6c 65 64 20 62 79 20 74 68 65 20 22 64 65 66  dled by the "def
50b0: 61 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f  ault:" case belo
50c0: 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30  w..  */.  case 0
50d0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
50e0: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
50f0: 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a  .  case EAGAIN:.
5100: 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54    case ETIMEDOUT
5110: 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a  :.  case EBUSY:.
5120: 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20    case EINTR:.  
5130: 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20  case ENOLCK:  . 
5140: 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53     /* random NFS
5150: 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e   retry error, un
5160: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
5170: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
5180: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
5190: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
51a0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
51b0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
51c0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
51d0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20  ITE_BUSY;.    . 
51e0: 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20   case EACCES: . 
51f0: 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20     /* EACCES is 
5200: 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69  like EAGAIN duri
5210: 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ng locking opera
5220: 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61  tions, but not a
5230: 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a  ny other time*/.
5240: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49      if( (sqliteI
5250: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
5260: 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09  OERR_LOCK) || ..
5270: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
5280: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
5290: 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74  OCK) || ..(sqlit
52a0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
52b0: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c  _IOERR_RDLOCK) |
52c0: 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20  |..(sqliteIOErr 
52d0: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
52e0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
52f0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  K) ){.      retu
5300: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5310: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73      }.    /* els
5320: 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  e fall through *
5330: 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20  /.  case EPERM: 
5340: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5350: 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20  TE_PERM;.    .  
5360: 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73 20 6f 6e  /* EDEADLK is on
5370: 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 61  ly possible if a
5380: 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c 28 46   call to fcntl(F
5390: 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d 61 64 65  _SETLKW) is made
53a0: 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20  . And.  ** this 
53b0: 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d 61 6b  module never mak
53c0: 65 73 20 73 75 63 68 20 61 20 63 61 6c 6c 2e 20  es such a call. 
53d0: 41 6e 64 20 74 68 65 20 63 6f 64 65 20 69 6e 20  And the code in 
53e0: 53 51 4c 69 74 65 20 69 74 73 65 6c 66 20 0a 20  SQLite itself . 
53f0: 20 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74   ** asserts that
5400: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
5410: 4f 43 4b 45 44 20 69 73 20 6e 65 76 65 72 20 72  OCKED is never r
5420: 65 74 75 72 6e 65 64 2e 20 46 6f 72 20 74 68 65  eturned. For the
5430: 73 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a 2a 20  se reasons.  ** 
5440: 74 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  this case is als
5450: 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e  o commented out.
5460: 20 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 64   If the system d
5470: 6f 65 73 20 73 65 74 20 65 72 72 6e 6f 20 74 6f  oes set errno to
5480: 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74   EDEADLK,.  ** t
5490: 68 65 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54  he default SQLIT
54a0: 45 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f 64 65  E_IOERR_XXX code
54b0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
54c0: 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 63 61  d. */.#if 0.  ca
54d0: 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20  se EDEADLK:.    
54e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
54f0: 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e  ERR_BLOCKED;.#en
5500: 64 69 66 0a 20 20 20 20 0a 23 69 66 20 45 4f 50  dif.    .#if EOP
5510: 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50  NOTSUPP!=ENOTSUP
5520: 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55  .  case EOPNOTSU
5530: 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65  PP: .    /* some
5540: 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69  thing went terri
5550: 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73  bly awry, unless
5560: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
5570: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
5580: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
5590: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
55a0: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
55b0: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
55c0: 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54  ndif.#ifdef ENOT
55d0: 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53  SUP.  case ENOTS
55e0: 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61  UP: .    /* inva
55f0: 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64  lid fd, unless d
5600: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
5610: 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73  m support intros
5620: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
5630: 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74  h .     * it act
5640: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
5650: 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64   it says */.#end
5660: 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20  if.  case EIO:. 
5670: 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63   case EBADF:.  c
5680: 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61  ase EINVAL:.  ca
5690: 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63  se ENOTCONN:.  c
56a0: 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61  ase ENODEV:.  ca
56b0: 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65  se ENXIO:.  case
56c0: 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73 65 20   ENOENT:.  case 
56d0: 45 53 54 41 4c 45 3a 0a 20 20 63 61 73 65 20 45  ESTALE:.  case E
56e0: 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68  NOSYS:.    /* th
56f0: 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65  ese should force
5700: 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63   the client to c
5710: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e  lose the file an
5720: 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20  d reconnect */. 
5730: 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a     .  default: .
5740: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
5750: 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a  eIOErr;.  }.}...
5760: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
5770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57b0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
57c0: 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65  *** Begin Unique
57d0: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
57e0: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
57f0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
5800: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76  .**.** On most v
5810: 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c  ersions of unix,
5820: 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e   we can get a un
5830: 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69  ique ID for a fi
5840: 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74  le by concatenat
5850: 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63  ing.** the devic
5860: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
5870: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
5880: 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  But this does no
5890: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
58a0: 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73  s..** On VxWorks
58b0: 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  , a unique file 
58c0: 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64  id must be based
58d0: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
58e0: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a  l filename..**.*
58f0: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
5900: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
5910: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
5920: 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65  cture can be use
5930: 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65  d as a.** unique
5940: 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f   file ID in VxWo
5950: 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61  rks.  Each insta
5960: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
5970: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
5980: 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  * a copy of the 
5990: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
59a0: 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c  me.  There is al
59b0: 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  so a reference c
59c0: 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73  ount.  .** The s
59d0: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c  tructure is recl
59e0: 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e  aimed when the n
59f0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
5a00: 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f  s to it drops to
5a10: 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  .** zero..**.** 
5a20: 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20  There are never 
5a30: 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20  very many files 
5a40: 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65  open at one time
5a50: 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65   and lookups are
5a60: 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72   not.** a perfor
5a70: 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70  mance-critical p
5a80: 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75  ath, so it is su
5a90: 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20  fficient to put 
5aa0: 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75  these.** structu
5ab0: 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  res on a linked 
5ac0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
5ad0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a  vxworksFileId {.
5ae0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
5af0: 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20  FileId *pNext;  
5b00: 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73  /* Next in a lis
5b10: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
5b20: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
5b50: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
5b60: 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e   one */.  int nN
5b70: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
5b80: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
5b90: 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69  h of the zCanoni
5ba0: 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67  calName[] string
5bb0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e   */.  char *zCan
5bc0: 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20  onicalName;     
5bd0: 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c      /* Canonical
5be0: 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a   filename */.};.
5bf0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
5c00: 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75  /* .** All uniqu
5c10: 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
5c20: 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  held on a linked
5c30: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
5c40: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65  this.** variable
5c50: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  :.*/.static stru
5c60: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
5c70: 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73   *vxworksFileLis
5c80: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69  t = 0;../*.** Si
5c90: 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d  mplify a filenam
5ca0: 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e  e into its canon
5cb0: 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20  ical form.** by 
5cc0: 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  making the follo
5cd0: 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a  wing changes:.**
5ce0: 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20  .**  * removing 
5cf0: 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64  any trailing and
5d00: 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20   duplicate /.** 
5d10: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69   * convert /./ i
5d20: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a  nto just /.**  *
5d30: 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20   convert /A/../ 
5d40: 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73  where A is any s
5d50: 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20  imple name into 
5d60: 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61  just /.**.** Cha
5d70: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e  nges are made in
5d80: 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20  -place.  Return 
5d90: 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e  the new name len
5da0: 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  gth..**.** The o
5db0: 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
5dc0: 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d   is in z[0..n-1]
5dd0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
5de0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61  mber of.** chara
5df0: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d  cters in the sim
5e00: 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f  plified name..*/
5e10: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f  .static int vxwo
5e20: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
5e30: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
5e40: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77  .  int i, j;.  w
5e50: 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e  hile( n>1 && z[n
5e60: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b  -1]=='/' ){ n--;
5e70: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20   }.  for(i=j=0; 
5e80: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
5e90: 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[i]=='/' ){.
5ea0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
5eb0: 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='/' ) continue
5ec0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  ;.      if( z[i+
5ed0: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e  1]=='.' && i+2<n
5ee0: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20   && z[i+2]=='/' 
5ef0: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  ){.        i += 
5f00: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
5f10: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
5f20: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
5f30: 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a  .' && i+3<n && z
5f40: 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b  [i+2]=='.' && z[
5f50: 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
5f60: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
5f70: 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  && z[j-1]!='/' )
5f80: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
5f90: 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b   if( j>0 ){ j--;
5fa0: 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20   }.        i += 
5fb0: 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  2;.        conti
5fc0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
5fd0: 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20   }.    z[j++] = 
5fe0: 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d  z[i];.  }.  z[j]
5ff0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a   = 0;.  return j
6000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
6010: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  a unique file ID
6020: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61   for the given a
6030: 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65  bsolute pathname
6040: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
6050: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78  ointer to the vx
6060: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
6070: 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65  ct.  This pointe
6080: 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a  r is the unique.
6090: 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a  ** file ID..**.*
60a0: 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64  * The nRef field
60b0: 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46   of the vxworksF
60c0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
60d0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f  incremented befo
60e0: 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  re.** the object
60f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
6100: 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65   new vxworksFile
6110: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  Id object is cre
6120: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65  ated.** and adde
6130: 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  d to the global 
6140: 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72  list if necessar
6150: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  y..**.** If a me
6160: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
6170: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
6180: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
6190: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
61a0: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
61b0: 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e  ksFindFileId(con
61c0: 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75  st char *zAbsolu
61d0: 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63  teName){.  struc
61e0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
61f0: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f  *pNew;         /
6200: 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64  * search key and
6210: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
6220: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
6230: 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61  FileId *pCandida
6240: 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  te;   /* For loo
6250: 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69  ping over existi
6260: 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20  ng file IDs */. 
6270: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
62a0: 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20  f zAbsoluteName 
62b0: 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  string */..  ass
62c0: 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ert( zAbsoluteNa
62d0: 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20  me[0]=='/' );.  
62e0: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
62f0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a  zAbsoluteName);.
6300: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
6310: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
6320: 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29  *pNew) + (n+1) )
6330: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
6340: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
6350: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
6360: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
6370: 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  w[1];.  memcpy(p
6380: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
6390: 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ame, zAbsoluteNa
63a0: 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20  me, n+1);.  n = 
63b0: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
63c0: 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ame(pNew->zCanon
63d0: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20  icalName, n);.. 
63e0: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
63f0: 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
6400: 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74   that matching t
6410: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d  he canonical nam
6420: 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64  e..  ** If found
6430: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  , increment the 
6440: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
6450: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
6460: 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  nter to.  ** the
6470: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
6480: 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  D..  */.  unixEn
6490: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
64a0: 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77  r(pCandidate=vxw
64b0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43  orksFileList; pC
64c0: 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69  andidate; pCandi
64d0: 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d  date=pCandidate-
64e0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
64f0: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61   pCandidate->nNa
6500: 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d  me==n .     && m
6510: 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65  emcmp(pCandidate
6520: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
6530: 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  , pNew->zCanonic
6540: 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20  alName, n)==0.  
6550: 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
6560: 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
6570: 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74         pCandidat
6580: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  e->nRef++;.     
6590: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
65a0: 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72  ();.       retur
65b0: 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20  n pCandidate;.  
65c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
65d0: 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64   match was found
65e0: 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20  .  We will make 
65f0: 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  a new file ID */
6600: 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20  .  pNew->nRef = 
6610: 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65  1;.  pNew->nName
6620: 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = n;.  pNew->pN
6630: 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c  ext = vxworksFil
6640: 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73  eList;.  vxworks
6650: 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b  FileList = pNew;
6660: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
6670: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  x();.  return pN
6680: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ew;.}../*.** Dec
6690: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
66a0: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20  ence count on a 
66b0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
66c0: 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74  ject.  Free.** t
66d0: 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74  he object when t
66e0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
66f0: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
6700: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6710: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
6720: 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f  leId(struct vxwo
6730: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b  rksFileId *pId){
6740: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
6750: 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
6760: 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Id->nRef>0 );.  
6770: 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pId->nRef--;.  i
6780: 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20  f( pId->nRef==0 
6790: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78  ){.    struct vx
67a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70  worksFileId **pp
67b0: 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78  ;.    for(pp=&vx
67c0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a  worksFileList; *
67d0: 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20  pp && *pp!=pId; 
67e0: 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e  pp = &((*pp)->pN
67f0: 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65  ext)){}.    asse
6800: 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a  rt( *pp==pId );.
6810: 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70      *pp = pId->p
6820: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
6830: 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d  3_free(pId);.  }
6840: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
6850: 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  x();.}.#endif /*
6860: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
6870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
6880: 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69  End of Unique Fi
6890: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
68a0: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
68b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
68c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
6910: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
6920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6960: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
6970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73  ************ Pos
6980: 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
6990: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
69a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69b0: 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76  .**.** POSIX adv
69c0: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20  isory locks are 
69d0: 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e  broken by design
69e0: 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33  .  ANSI STD 1003
69f0: 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63  .1 (1996).** sec
6a00: 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e  tion 6.5.2.2 lin
6a10: 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34  es 483 through 4
6a20: 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20  90 specify that 
6a30: 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a  when a process.*
6a40: 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73  * sets or clears
6a50: 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70   a lock, that op
6a60: 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65  eration override
6a70: 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b  s any prior lock
6a80: 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20  s set.** by the 
6a90: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49  same process.  I
6aa0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69  t does not expli
6ab0: 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75  citly say so, bu
6ac0: 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a  t this implies.*
6ad0: 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69  * that it overri
6ae0: 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79  des locks set by
6af0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
6b00: 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72  s using a differ
6b10: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
6b20: 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65  riptor.  Conside
6b30: 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65  r this test case
6b40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e  :.**.**       in
6b50: 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd1 = open("./
6b60: 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f  file1", O_RDWR|O
6b70: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
6b80: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20  *       int fd2 
6b90: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22  = open("./file2"
6ba0: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
6bb0: 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53  , 0644);.**.** S
6bc0: 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61  uppose ./file1 a
6bd0: 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72  nd ./file2 are r
6be0: 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  eally the same f
6bf0: 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ile (because.** 
6c00: 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72  one is a hard or
6c10: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74   symbolic link t
6c20: 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65  o the other) the
6c30: 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20  n if you set.** 
6c40: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
6c50: 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74  k on fd1, then t
6c60: 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63  ry to get an exc
6c70: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f  lusive lock.** o
6c80: 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e  n fd2, it works.
6c90: 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65    I would have e
6ca0: 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f  xpected the seco
6cb0: 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61  nd lock to.** fa
6cc0: 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  il since there w
6cd0: 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  as already a loc
6ce0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75  k on the file du
6cf0: 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74  e to fd1..** But
6d00: 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20   not so.  Since 
6d10: 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20  both locks came 
6d20: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72  from the same pr
6d30: 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65  ocess, the.** se
6d40: 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74  cond overrides t
6d50: 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74  he first, even t
6d60: 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20  hough they were 
6d70: 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  on different.** 
6d80: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
6d90: 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65   opened on diffe
6da0: 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e  rent file names.
6db0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e  .**.** This mean
6dc0: 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  s that we cannot
6dd0: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
6de0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
6df0: 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61  file access.** a
6e00: 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74  mong competing t
6e10: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
6e20: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
6e30: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
6e40: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
6e50: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
6e60: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
6e70: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
6e80: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
6e90: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
6ea0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
6eb0: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
6ec0: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
6ed0: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
6ee0: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
6ef0: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
6f00: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
6f10: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
6f20: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
6f30: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
6f40: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
6f50: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
6f60: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
6f70: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
6f80: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
6f90: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
6fa0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
6fb0: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
6fc0: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
6fd0: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
6fe0: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
6ff0: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
7000: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
7010: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
7020: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
7030: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
7040: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
7050: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
7060: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
7070: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
7080: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
7090: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
70a0: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
70b0: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73  inode..**.** (As
70c0: 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20  ide: The use of 
70d0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73  inode numbers as
70e0: 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73   unique IDs does
70f0: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
7100: 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57  orks..** For VxW
7110: 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f  orks, we have to
7120: 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61   use the alterna
7130: 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73  tive unique ID s
7140: 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a  ystem based on.*
7150: 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * canonical file
7160: 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65  name and impleme
7170: 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76  nted in the prev
7180: 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a  ious division.).
7190: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
71a0: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
71b0: 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f   for POSIX is no
71c0: 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20   longer just an 
71d0: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
71e0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20  descriptor.  It 
71f0: 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75  is now a structu
7200: 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  re that holds th
7210: 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  e integer file.*
7220: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  * descriptor and
7230: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7240: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
7250: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74  escribes the int
7260: 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f  ernal.** locks o
7270: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
7280: 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72  ing inode.  Ther
7290: 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67  e is one locking
72a0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65   structure.** pe
72b0: 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74  r inode, so if t
72c0: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73  he same inode is
72d0: 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62   opened twice, b
72e0: 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72  oth unixFile str
72f0: 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74  uctures.** point
7300: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63   to the same loc
7310: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  king structure. 
7320: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   The locking str
7330: 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20  ucture keeps.** 
7340: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
7350: 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  t (so we will kn
7360: 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74  ow when to delet
7370: 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74  e it) and a "cnt
7380: 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20  ".** field that 
7390: 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74  tells us its int
73a0: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75  ernal lock statu
73b0: 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73  s.  cnt==0 means
73c0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
73d0: 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d  unlocked.  cnt==
73e0: 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c  -1 means the fil
73f0: 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  e has an exclusi
7400: 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e  ve lock..** cnt>
7410: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  0 means there ar
7420: 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63  e cnt shared loc
7430: 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ks on the file..
7440: 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70  **.** Any attemp
7450: 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  t to lock or unl
7460: 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74  ock a file first
7470: 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b   checks the lock
7480: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
7490: 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73  .  The fcntl() s
74a0: 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e  ystem call is on
74b0: 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  ly invoked to se
74c0: 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f  t a .** POSIX lo
74d0: 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  ck if the intern
74e0: 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72  al lock structur
74f0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65  e transitions be
7500: 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65  tween.** a locke
7510: 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65  d and an unlocke
7520: 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42  d state..**.** B
7530: 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20  ut wait:  there 
7540: 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f  are yet more pro
7550: 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58  blems with POSIX
7560: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e   advisory locks.
7570: 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c  .**.** If you cl
7580: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
7590: 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  iptor that point
75a0: 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74  s to a file that
75b0: 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61   has locks,.** a
75c0: 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  ll locks on that
75d0: 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f   file that are o
75e0: 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  wned by the curr
75f0: 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a  ent process are.
7600: 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f  ** released.  To
7610: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
7620: 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20  s problem, each 
7630: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
7640: 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e  ject.** maintain
7650: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
7660: 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69   number of pendi
7670: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20  ng locks on tha 
7680: 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61  inode..** When a
7690: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
76a0: 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e  e to close an un
76b0: 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65  ixFile, if there
76c0: 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e   are.** other un
76d0: 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74  ixFile open on t
76e0: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68  he same inode th
76f0: 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c  at are holding l
7700: 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a  ocks, the call.*
7710: 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65  * to close() the
7720: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7730: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
7740: 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f  il all of the lo
7750: 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68  cks clear..** Th
7760: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
7770: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
7780: 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64  a list of file d
7790: 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20  escriptors that 
77a0: 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c  need to.** be cl
77b0: 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69  osed and that li
77c0: 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e  st is walked (an
77d0: 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20  d cleared) when 
77e0: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a  the last lock.**
77f0: 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59   clears..**.** Y
7800: 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c  et another probl
7810: 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64  em:  LinuxThread
7820: 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65  s do not play we
7830: 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f  ll with posix lo
7840: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20  cks..**.** Many 
7850: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
7860: 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20  f linux use the 
7870: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62  LinuxThreads lib
7880: 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a  rary which is.**
7890: 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c   not posix compl
78a0: 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e  iant.  Under Lin
78b0: 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63  uxThreads, a loc
78c0: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
78d0: 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20  ead.** A cannot 
78e0: 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f  be modified or o
78f0: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64  verridden by a d
7900: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
7910: 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61  B..** Only threa
7920: 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74  d A can modify t
7930: 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e  he lock.  Lockin
7940: 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  g behavior is co
7950: 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20  rrect.** if the 
7960: 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20  appliation uses 
7970: 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65  the newer Native
7980: 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69   Posix Thread Li
7990: 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20  brary (NPTL).** 
79a0: 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20  on linux - with 
79b0: 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61  NPTL a lock crea
79c0: 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20  ted by thread A 
79d0: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
79e0: 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20  ks.** in thread 
79f0: 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  B.  But there is
7a00: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
7a10: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
7a20: 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69  which.** threadi
7a30: 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65  ng library is be
7a40: 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68  ing used.  So th
7a50: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
7a60: 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70   know at.** comp
7a70: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
7a80: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41   or not thread A
7a90: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
7aa0: 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e  cks on thread B.
7ab0: 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64  .** One has to d
7ac0: 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65  o a run-time che
7ad0: 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  ck to discover t
7ae0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
7af0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72  he.** current pr
7b00: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ocess..**.** SQL
7b10: 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70  ite used to supp
7b20: 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73  ort LinuxThreads
7b30: 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66  .  But support f
7b40: 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a  or LinuxThreads.
7b50: 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62  ** was dropped b
7b60: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65  eginning with ve
7b70: 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51  rsion 3.7.0.  SQ
7b80: 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  Lite will still 
7b90: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e  work with.** Lin
7ba0: 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64  uxThreads provid
7bb0: 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72  ed that (1) ther
7bc0: 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  e is no more tha
7bd0: 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n one connection
7be0: 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73   .** per databas
7bf0: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  e file in the sa
7c00: 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28  me process and (
7c10: 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  2) database conn
7c20: 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f  ections.** do no
7c30: 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68  t move across th
7c40: 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  reads..*/../*.**
7c50: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
7c60: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
7c70: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
7c80: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
7c90: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
7ca0: 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f  rticular unixIno
7cb0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  deInfo object..*
7cc0: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  /.struct unixFil
7cd0: 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  eId {.  dev_t de
7ce0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
7cf0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75      /* Device nu
7d00: 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56  mber */.#if OS_V
7d10: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
7d20: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
7d30: 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66  Id;  /* Unique f
7d40: 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72  ile ID for vxwor
7d50: 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69  ks. */.#else.  i
7d60: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20  no_t ino;       
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7d80: 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65  ode number */.#e
7d90: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
7da0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
7db0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
7dc0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
7dd0: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
7de0: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20  .** inode.  Or, 
7df0: 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  on LinuxThreads,
7e00: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66   there is one of
7e10: 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
7e20: 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e  s for.** each in
7e30: 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61  ode opened by ea
7e40: 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ch thread..**.**
7e50: 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20   A single inode 
7e60: 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
7e70: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
7e80: 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78  rs, so each unix
7e90: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
7ea0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
7eb0: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
7ec0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
7ed0: 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f  ct and this.** o
7ee0: 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f  bject keeps a co
7ef0: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
7f00: 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f  r of unixFile po
7f10: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f  inting to it..*/
7f20: 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64  .struct unixInod
7f30: 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74  eInfo {.  struct
7f40: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
7f50: 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
7f60: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
7f70: 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20   int nShared;   
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48   /* Number of SH
7fa0: 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ARED locks held 
7fb0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
7fc0: 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20  ar eFileLock;   
7fd0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
7fe0: 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
7ff0: 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a  RVED_LOCK etc. *
8000: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8010: 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20  r bProcessLock; 
8020: 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73      /* An exclus
8030: 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b  ive process lock
8040: 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e   is held */.  in
8050: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8070: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
8080: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
8090: 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53  cture */.  unixS
80a0: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
80b0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ;          /* Sh
80c0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
80d0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
80e0: 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   inode */.  int 
80f0: 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  nLock;          
8100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8110: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
8120: 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ding file locks 
8130: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
8140: 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20  d *pUnused;     
8150: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66       /* Unused f
8160: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
8170: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e  to close */.  un
8180: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65  ixInodeInfo *pNe
8190: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  xt;           /*
81a0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69   List of all uni
81b0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
81c0: 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ts */.  unixInod
81d0: 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20  eInfo *pPrev;   
81e0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e          /*    ..
81f0: 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  .. doubly linked
8200: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   */.#if SQLITE_E
8210: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
8220: 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  YLE.  unsigned l
8230: 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42  ong long sharedB
8240: 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50  yte;  /* for AFP
8250: 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65   simulated share
8260: 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66  d lock */.#endif
8270: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
8280: 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20    sem_t *pSem;  
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82a0: 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58    /* Named POSIX
82b0: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20   semaphore */.  
82c0: 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41  char aSemName[MA
82d0: 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20  X_PATHNAME+2];  
82e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20  /* Name of that 
82f0: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e  semaphore */.#en
8300: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
8310: 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69  lists of all uni
8320: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
8330: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  ts..*/.static un
8340: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f  ixInodeInfo *ino
8350: 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  deList = 0;../*.
8360: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
8370: 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72  ion - unixLogErr
8380: 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20  or_x(), is only 
8390: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
83a0: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69  the macro.** uni
83b0: 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  xLogError()..**.
83c0: 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64  ** It is invoked
83d0: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
83e0: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
83f0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72  function and err
8400: 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73  no has been.** s
8410: 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  et. It logs a me
8420: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
8430: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
8440: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
8450: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
8460: 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69  no and, if possi
8470: 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72  ble, the human-r
8480: 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65  eadable equivale
8490: 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  nt from strerror
84a0: 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f  () or.** strerro
84b0: 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  r_r()..**.** The
84c0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
84d0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61  passed to the ma
84e0: 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68  cro should be th
84f0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  e error code tha
8500: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  t.** will be ret
8510: 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
8520: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (e.g. SQLITE_IOE
8530: 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54  RR_DELETE, SQLIT
8540: 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a  E_CANTOPEN). .**
8550: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
8560: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
8570: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
8580: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
8590: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
85a0: 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b  ed (e.g. "unlink
85b0: 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74  ", "open") and t
85c0: 68 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  he the associate
85d0: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61  d file-system pa
85e0: 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a  th,.** if any..*
85f0: 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f  /.#define unixLo
8600: 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20  gError(a,b,c)   
8610: 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74    unixLogErrorAt
8620: 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e  Line(a,b,c,__LIN
8630: 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20  E__).static int 
8640: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
8650: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
8660: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
8670: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
8680: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
8690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
86a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
86b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75  /* Name of OS fu
86c0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c  nction that fail
86d0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
86e0: 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
86f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
8700: 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20  path associated 
8710: 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20  with error */.  
8720: 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20  int iLine       
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e  /* Source line n
8750: 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f  umber where erro
8760: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b  r occurred */.){
8770: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20  .  char *zErr;  
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72     /* Message fr
87a0: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
87b0: 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20   equivalent */. 
87c0: 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72   int iErrno = er
87d0: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
87e0: 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c   /* Saved syscal
87f0: 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a  l error number *
8800: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
8810: 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73  is not a threads
8820: 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54  afe build (SQLIT
8830: 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29  E_THREADSAFE==0)
8840: 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20  , then use.  ** 
8850: 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20 66  the strerror() f
8860: 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  unction to obtai
8870: 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  n the human-read
8880: 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  able error messa
8890: 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65  ge.  ** equivale
88a0: 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68  nt to errno. Oth
88b0: 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72 65  erwise, use stre
88c0: 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a  rror_r()..  */ .
88d0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
88e0: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
88f0: 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52  (HAVE_STRERROR_R
8900: 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38 30  ).  char aErr[80
8910: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72  ];.  memset(aErr
8920: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72  , 0, sizeof(aErr
8930: 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72  ));.  zErr = aEr
8940: 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45  r;..  /* If STRE
8950: 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73  RROR_R_CHAR_P (s
8960: 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73  et by autoconf s
8970: 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45  cripts) or __USE
8980: 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c  _GNU is defined,
8990: 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
89a0: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
89b0: 76 69 64 65 73 20 74 68 65 20 74 68 65 20 47 4e  vides the the GN
89c0: 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72  U version of str
89d0: 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 20 0a  error_r() that .
89e0: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70    ** returns a p
89f0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
8a00: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
8a10: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
8a20: 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20   That pointer . 
8a30: 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   ** may point to
8a40: 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d   aErr[], or it m
8a50: 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ay point to some
8a60: 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20   static storage 
8a70: 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a  somewhere. .  **
8a80: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   Otherwise, assu
8a90: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
8aa0: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
8ab0: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66  POSIX version of
8ac0: 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f   .  ** strerror_
8ad0: 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79  r(), which alway
8ae0: 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f  s writes an erro
8af0: 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61  r message into a
8b00: 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Err[]..  **.  **
8b10: 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63   If the code inc
8b20: 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73  orrectly assumes
8b30: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
8b40: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68  POSIX version th
8b50: 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c  at is.  ** avail
8b60: 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20  able, the error 
8b70: 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74  message will oft
8b80: 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73  en be an empty s
8b90: 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a  tring. Not a.  *
8ba0: 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20  * huge problem. 
8bb0: 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63  Incorrectly conc
8bc0: 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20  luding that the 
8bd0: 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61  GNU version is a
8be0: 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63  vailable .  ** c
8bf0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73  ould lead to a s
8c00: 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a  egfault though..
8c10: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
8c20: 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52  (STRERROR_R_CHAR
8c30: 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  _P) || defined(_
8c40: 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72  _USE_GNU).  zErr
8c50: 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74   = .# endif.  st
8c60: 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c  rerror_r(iErrno,
8c70: 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45   aErr, sizeof(aE
8c80: 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53  rr)-1);..#elif S
8c90: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
8ca0: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20  .  /* This is a 
8cb0: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
8cc0: 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72  , but strerror_r
8cd0: 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  () is not availa
8ce0: 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  ble. */.  zErr =
8cf0: 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20   "";.#else.  /* 
8d00: 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62  Non-threadsafe b
8d10: 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72  uild, use strerr
8d20: 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  or(). */.  zErr 
8d30: 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e  = strerror(iErrn
8d40: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  o);.#endif..  as
8d50: 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53  sert( errcode!=S
8d60: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
8d70: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
8d80: 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74  th = "";.  sqlit
8d90: 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
8da0: 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63        "os_unix.c
8db0: 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29  :%d: (%d) %s(%s)
8dc0: 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
8dd0: 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75  ine, iErrno, zFu
8de0: 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a  nc, zPath, zErr.
8df0: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65    );..  return e
8e00: 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrcode;.}../*.**
8e10: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65   Close a file de
8e20: 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
8e30: 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63  We assume that c
8e40: 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c  lose() almost al
8e50: 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63  ways works, sinc
8e60: 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20  e it is only in 
8e70: 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61  a.** very sick a
8e80: 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e  pplication or on
8e90: 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61   a very sick pla
8ea0: 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69  tform that it mi
8eb0: 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20  ght fail..** If 
8ec0: 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69  it does fail, si
8ed0: 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69  mply leak the fi
8ee0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62  le descriptor, b
8ef0: 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a  ut do log the.**
8f00: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   error..**.** No
8f10: 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  te that it is no
8f20: 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20  t safe to retry 
8f30: 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49  close() after EI
8f40: 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  NTR since the.**
8f50: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8f60: 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65   might have alre
8f70: 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20  ady been reused 
8f80: 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  by another threa
8f90: 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27  d..** So we don'
8fa0: 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65  t even try to re
8fb0: 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49  cover from an EI
8fc0: 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74  NTR.  Just log t
8fd0: 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20  he error.** and 
8fe0: 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  move on..*/.stat
8ff0: 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63  ic void robust_c
9000: 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  lose(unixFile *p
9010: 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74  File, int h, int
9020: 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20   lineno){.  if( 
9030: 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20  osClose(h) ){.  
9040: 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74    unixLogErrorAt
9050: 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52  Line(SQLITE_IOER
9060: 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22  R_CLOSE, "close"
9070: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9080: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f           pFile ?
9090: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20   pFile->zPath : 
90a0: 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a  0, lineno);.  }.
90b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
90c0: 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ll file descript
90d0: 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20 69  ors accumuated i
90e0: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
90f0: 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  nfo->pUnused lis
9100: 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  t..*/ .static vo
9110: 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46  id closePendingF
9120: 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ds(unixFile *pFi
9130: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
9140: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
9150: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
9160: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b  UnixUnusedFd *p;
9170: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
9180: 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d  *pNext;.  for(p=
9190: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
91a0: 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
91b0: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
91c0: 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  xt;.    robust_c
91d0: 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66  lose(pFile, p->f
91e0: 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
91f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
9200: 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d  );.  }.  pInode-
9210: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
9220: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
9230: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
9240: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
9250: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
9260: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
9270: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
9280: 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20  x entered using 
9290: 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
92a0: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ex() function mu
92b0: 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
92c0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
92d0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
92e0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
92f0: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78  seInodeInfo(unix
9300: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
9310: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
9320: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
9330: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
9340: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
9350: 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
9360: 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20  (pInode) ){.    
9370: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  pInode->nRef--;.
9380: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
9390: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
93a0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
93b0: 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a  >pShmNode==0 );.
93c0: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
93d0: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
93e0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
93f0: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
9400: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
9410: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70  >pPrev->pNext==p
9420: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
9430: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
9440: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
9450: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
9460: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
9470: 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70  rt( inodeList==p
9480: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
9490: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
94a0: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
94b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
94c0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  node->pNext ){. 
94d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
94e0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
94f0: 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  rev==pInode );. 
9500: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
9510: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  Next->pPrev = pI
9520: 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20  node->pPrev;.   
9530: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
9540: 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b  e3_free(pInode);
9550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9560: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65  .** Given a file
9570: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63   descriptor, loc
9580: 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ate the unixInod
9590: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  eInfo object tha
95a0: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74  t.** describes t
95b0: 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70  hat file descrip
95c0: 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e  tor.  Create a n
95d0: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
95e0: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74  ary.  The.** ret
95f0: 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20  urn value might 
9600: 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  be uninitialized
9610: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
9620: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  urs..**.** The m
9630: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
9640: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
9650: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
9660: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
9670: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
9680: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
9690: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  *.** Return an a
96a0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
96b0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
96c0: 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e   int findInodeIn
96d0: 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  fo(.  unixFile *
96e0: 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
96f0: 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c       /* Unix fil
9700: 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63  e with file desc
9710: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79   used in the key
9720: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
9730: 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20  nfo **ppInode   
9740: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
9750: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
9760: 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a   object here */.
9770: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9790: 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61      /* System ca
97a0: 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ll return code *
97b0: 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
97e0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46  escriptor for pF
97f0: 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ile */.  struct 
9800: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
9810: 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75  d;      /* Looku
9820: 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e  p key for the un
9830: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20  ixInodeInfo */. 
9840: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
9850: 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  tbuf;           
9860: 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
9870: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
9880: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
9890: 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20   *pInode = 0;   
98a0: 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75    /* Candidate u
98b0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
98c0: 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ect */..  assert
98d0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
98e0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c  ) );..  /* Get l
98f0: 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61  ow-level informa
9900: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
9910: 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20  ile that we can 
9920: 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65  used to.  ** cre
9930: 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d  ate a unique nam
9940: 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  e for the file..
9950: 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c    */.  fd = pFil
9960: 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46  e->h;.  rc = osF
9970: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
9980: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
9990: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
99a0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
99b0: 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f  .#ifdef EOVERFLO
99c0: 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  W.    if( pFile-
99d0: 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45  >lastErrno==EOVE
99e0: 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53  RFLOW ) return S
99f0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e  QLITE_NOLFS;.#en
9a00: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
9a10: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
9a20: 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45  ..#ifdef __APPLE
9a30: 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20  __.  /* On OS X 
9a40: 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65  on an msdos file
9a50: 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64  system, the inod
9a60: 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f  e number is repo
9a70: 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72  rted.  ** incorr
9a80: 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73  ectly for zero-s
9a90: 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20  ize files.  See 
9aa0: 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54  ticket #3260.  T
9ab0: 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75  o work.  ** arou
9ac0: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  nd this problem 
9ad0: 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20  (we consider it 
9ae0: 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e  a bug in OS X, n
9af0: 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20  ot SQLite).  ** 
9b00: 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61  we always increa
9b10: 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  se the file size
9b20: 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67   to 1 by writing
9b30: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20   a single byte. 
9b40: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63   ** prior to acc
9b50: 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65  essing the inode
9b60: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e   number.  The on
9b70: 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69  e byte written i
9b80: 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20  s.  ** an ASCII 
9b90: 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68  'S' character wh
9ba0: 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73  ich also happens
9bb0: 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
9bc0: 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68   byte.  ** in th
9bd0: 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72  e header of ever
9be0: 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  y SQLite databas
9bf0: 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  e.  In this way,
9c00: 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69   if there.  ** i
9c10: 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
9c20: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f  on such that ano
9c30: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
9c40: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
9c50: 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  d.  ** the first
9c60: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
9c70: 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65  abase, no damage
9c80: 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   is done..  */. 
9c90: 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f   if( statbuf.st_
9ca0: 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c  size==0 && (pFil
9cb0: 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c  e->fsFlags & SQL
9cc0: 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
9cd0: 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20  SDOS)!=0 ){.    
9ce0: 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65  do{ rc = osWrite
9cf0: 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77  (fd, "S", 1); }w
9d00: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
9d10: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
9d20: 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20    if( rc!=1 ){. 
9d30: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
9d40: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
9d50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9d60: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
9d70: 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74      rc = osFstat
9d80: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
9d90: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
9da0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
9db0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
9dc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9dd0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
9de0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
9df0: 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20  memset(&fileId, 
9e00: 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  0, sizeof(fileId
9e10: 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76  ));.  fileId.dev
9e20: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
9e30: 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  v;.#if OS_VXWORK
9e40: 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d  S.  fileId.pId =
9e50: 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c   pFile->pId;.#el
9e60: 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20  se.  fileId.ino 
9e70: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
9e80: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64  ;.#endif.  pInod
9e90: 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  e = inodeList;. 
9ea0: 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
9eb0: 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64  & memcmp(&fileId
9ec0: 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  , &pInode->fileI
9ed0: 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  d, sizeof(fileId
9ee0: 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  )) ){.    pInode
9ef0: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
9f00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f  ;.  }.  if( pIno
9f10: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e  de==0 ){.    pIn
9f20: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
9f30: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49  lloc( sizeof(*pI
9f40: 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28  node) );.    if(
9f50: 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20   pInode==0 ){.  
9f60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9f70: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
9f80: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65     memset(pInode
9f90: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  , 0, sizeof(*pIn
9fa0: 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ode));.    memcp
9fb0: 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  y(&pInode->fileI
9fc0: 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65  d, &fileId, size
9fd0: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20  of(fileId));.   
9fe0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20   pInode->nRef = 
9ff0: 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  1;.    pInode->p
a000: 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74  Next = inodeList
a010: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50  ;.    pInode->pP
a020: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rev = 0;.    if(
a030: 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f   inodeList ) ino
a040: 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  deList->pPrev = 
a050: 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64  pInode;.    inod
a060: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a  eList = pInode;.
a070: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
a080: 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ode->nRef++;.  }
a090: 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49  .  *ppInode = pI
a0a0: 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  node;.  return S
a0b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
a0c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a0d0: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
a0e0: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
a0f0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
a100: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
a110: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
a120: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
a130: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
a140: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
a150: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
a160: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
a170: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
a180: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
a190: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
a1a0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
a1b0: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
a1c0: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
a1d0: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
a1e0: 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
a1f0: 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b  ic int unixCheck
a200: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
a210: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
a220: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
a230: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a240: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
a250: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
a260: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
a270: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
a280: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
a290: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
a2a0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
a2b0: 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65  LOCK; );..  asse
a2c0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75  rt( pFile );.  u
a2d0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
a2e0: 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
a2f0: 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
a300: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
a310: 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  ds */..  /* Chec
a320: 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
a330: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
a340: 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
a350: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
a360: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
a370: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
a380: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
a390: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68  1;.  }..  /* Oth
a3a0: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
a3b0: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
a3c0: 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a   holds it..  */.
a3d0: 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f  #ifndef __DJGPP_
a3e0: 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  _.  if( !reserve
a3f0: 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e  d && !pFile->pIn
a400: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
a410: 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  k ){.    struct 
a420: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
a430: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
a440: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
a450: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
a460: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
a470: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  lock.l_len = 1;.
a480: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
a490: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69  = F_WRLCK;.    i
a4a0: 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65  f( osFcntl(pFile
a4b0: 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
a4c0: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ock) ){.      rc
a4d0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
a4e0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
a4f0: 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
a500: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
a510: 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  o;.    } else if
a520: 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46  ( lock.l_type!=F
a530: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
a540: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
a550: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
a560: 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
a570: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
a580: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
a590: 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e  d %d %d (unix)\n
a5a0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
a5b0: 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20   reserved));..  
a5c0: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
a5d0: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
a5e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
a5f0: 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74  pt to set a syst
a600: 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  em-lock on the f
a610: 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20  ile pFile.  The 
a620: 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63  lock is .** desc
a630: 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a  ribed by pLock..
a640: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69  **.** If the pFi
a650: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65  le was opened re
a660: 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e  ad/write from un
a670: 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68  ix-excl, then th
a680: 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65  e only lock.** e
a690: 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20  ver obtained is 
a6a0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
a6b0: 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74  k, and it is obt
a6c0: 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e  ained exactly on
a6d0: 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ce.** the first 
a6e0: 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73  time any lock is
a6f0: 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c   attempted.  All
a700: 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74   subsequent syst
a710: 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70  em locking.** op
a720: 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20  erations become 
a730: 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67  no-ops.  Locking
a740: 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c   operations stil
a750: 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61  l happen interna
a760: 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  lly,.** in order
a770: 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61   to coordinate a
a780: 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65  ccess between se
a790: 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20  parate database 
a7a0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77  connections.** w
a7b0: 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ithin this proce
a7c0: 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74  ss, but all of t
a7d0: 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69  hat is handled i
a7e0: 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65  n memory and the
a7f0: 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
a800: 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61  stem does not pa
a810: 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a  rticipate..**.**
a820: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
a830: 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68  s a pass-through
a840: 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c   to fcntl(F_SETL
a850: 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75  K) if pFile is u
a860: 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20  sing.** any VFS 
a870: 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78  other than "unix
a880: 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69  -excl" or if pFi
a890: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  le is opened on 
a8a0: 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61  "unix-excl".** a
a8b0: 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e  nd is read-only.
a8c0: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
a8d0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
a8e0: 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75  all completes su
a8f0: 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d  ccessfully, or -
a900: 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74  1 if a call.** t
a910: 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e  o fcntl() fails.
a920: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65   In this case, e
a930: 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72  rrno is set appr
a940: 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63  opriately (by fc
a950: 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69  ntl())..*/.stati
a960: 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f  c int unixFileLo
a970: 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
a980: 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  le, struct flock
a990: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20   *pLock){.  int 
a9a0: 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  rc;.  unixInodeI
a9b0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
a9c0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
a9d0: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
a9e0: 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65  Held() );.  asse
a9f0: 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b  rt( pInode!=0 );
aa00: 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65 2d 3e  .  if( ((pFile->
aa10: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
aa20: 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c  FILE_EXCL)!=0 ||
aa30: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
aa40: 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28 28 70  sLock).   && ((p
aa50: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
aa60: 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
aa70: 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  Y)==0).  ){.    
aa80: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  if( pInode->bPro
aa90: 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  cessLock==0 ){. 
aaa0: 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63       struct floc
aab0: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  k lock;.      as
aac0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
aad0: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock==0 );.      
aae0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
aaf0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
ab00: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ab10: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ab20: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
ab30: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
ab40: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
ab50: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20   F_WRLCK;.      
ab60: 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69  rc = osFcntl(pFi
ab70: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
ab80: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66  &lock);.      if
ab90: 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20  ( rc<0 ) return 
aba0: 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  rc;.      pInode
abb0: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d  ->bProcessLock =
abc0: 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   1;.      pInode
abd0: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ->nLock++;.    }
abe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
abf0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
ac00: 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  e{.    rc = osFc
ac10: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
ac20: 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20  SETLK, pLock);. 
ac30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
ac40: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
ac50: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
ac60: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
ac70: 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
ac80: 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
ac90: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
aca0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
acb0: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
acc0: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
acd0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
ace0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
acf0: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
ad00: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
ad10: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
ad20: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
ad30: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
ad40: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
ad50: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
ad60: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
ad70: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
ad80: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
ad90: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
ada0: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
adb0: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
adc0: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
add0: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
ade0: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
adf0: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
ae00: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
ae10: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
ae20: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
ae30: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
ae40: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
ae50: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
ae60: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
ae70: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
ae80: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
ae90: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
aea0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
aeb0: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
aec0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
aed0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
aee0: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
aef0: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
af00: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
af10: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
af20: 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
af30: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
af40: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
af50: 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
af60: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
af70: 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74  t unixLock(sqlit
af80: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
af90: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f   eFileLock){.  /
afa0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
afb0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d  describes the im
afc0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
afd0: 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b  the various lock
afe0: 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20  s and.  ** lock 
aff0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74  transitions in t
b000: 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49  erms of the POSI
b010: 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65  X advisory share
b020: 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  d and exclusive.
b030: 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74    ** lock primit
b040: 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61  ives (called rea
b050: 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74  d-locks and writ
b060: 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74  e-locks below, t
b070: 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e  o avoid.  ** con
b080: 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69  fusion with SQLi
b090: 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20  te lock names). 
b0a0: 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61  The algorithms a
b0b0: 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20  re complicated. 
b0c0: 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20   ** slightly in 
b0d0: 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70  order to be comp
b0e0: 61 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64  atible with wind
b0f0: 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75  ows systems simu
b100: 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20  ltaneously.  ** 
b110: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
b120: 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
b130: 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69  , in case that i
b140: 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e  s ever required.
b150: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f  .  **.  ** Symbo
b160: 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73  ls defined in os
b170: 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65  .h indentify the
b180: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
b190: 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65  and the 'reserve
b1a0: 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61  d.  ** byte', ea
b1b0: 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20  ch single bytes 
b1c0: 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66  at well known of
b1d0: 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27  fsets, and the '
b1e0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
b1f0: 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65   range', a range
b200: 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74   of 510 bytes at
b210: 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66   a well known of
b220: 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fset..  **.  ** 
b230: 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52  To obtain a SHAR
b240: 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d  ED lock, a read-
b250: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
b260: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
b270: 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66  .  ** byte'.  If
b280: 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73   this is success
b290: 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79  ful, a random by
b2a0: 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61  te from the 'sha
b2b0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
b2c0: 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63  nge' is read-loc
b2d0: 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ked and the lock
b2e0: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
b2f0: 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e   byte' released.
b300: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
b310: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
b320: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
b330: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
b340: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  s a SHARED lock.
b350: 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44  .  ** A RESERVED
b360: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
b370: 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67  nted by grabbing
b380: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
b390: 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72   the.  ** 'reser
b3a0: 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a  ved byte'. .  **
b3b0: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
b3c0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
b3d0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61  a PENDING lock a
b3e0: 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61  fter it has obta
b3f0: 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52  ined a.  ** SHAR
b400: 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49  ED lock. A PENDI
b410: 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  NG lock is imple
b420: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
b430: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
b440: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65  .  ** on the 'pe
b450: 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69  nding byte'. Thi
b460: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
b470: 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63  o new SHARED loc
b480: 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f  ks can be.  ** o
b490: 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69  btained, but exi
b4a0: 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63  sting SHARED loc
b4b0: 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  ks are allowed t
b4c0: 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f  o persist. A pro
b4d0: 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e  cess.  ** does n
b4e0: 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69  ot have to obtai
b4f0: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
b500: 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  k on the way to 
b510: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
b520: 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72    ** This proper
b530: 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ty is used by th
b540: 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20  e algorithm for 
b550: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
b560: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
b570: 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a   after a crash..
b580: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43    **.  ** An EXC
b590: 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74  LUSIVE lock, obt
b5a0: 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45  ained after a PE
b5b0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65  NDING lock is he
b5c0: 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c  ld, is.  ** impl
b5d0: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
b5e0: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
b5f0: 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20  k on the entire 
b600: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
b610: 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20  * range'. Since 
b620: 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20  all other locks 
b630: 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c  require a read-l
b640: 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ock on one of th
b650: 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74  e bytes.  ** wit
b660: 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20  hin this range, 
b670: 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  this ensures tha
b680: 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73  t no other locks
b690: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65   are held on the
b6a0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
b6b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
b6c0: 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62  eason a single b
b6d0: 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  yte cannot be us
b6e0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
b6f0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
b700: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68   ** range' is th
b710: 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  at some versions
b720: 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e   of windows do n
b730: 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d  ot support read-
b740: 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c  locks. By.  ** l
b750: 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20  ocking a random 
b760: 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67  byte from a rang
b770: 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48  e, concurrent SH
b780: 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65  ARED locks may e
b790: 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69  xist.  ** even i
b7a0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72  f the locking pr
b7b0: 69 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20  imitive used is 
b7c0: 61 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c  always a write-l
b7d0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ock..  */.  int 
b7e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b7f0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
b800: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
b810: 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
b820: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
b830: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 74  le->pInode;.  st
b840: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
b850: 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20  .  int tErrno = 
b860: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  0;..  assert( pF
b870: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
b880: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
b890: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
b8a0: 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
b8b0: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
b8c0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
b8d0: 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
b8e0: 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
b8f0: 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69  ock),.      azFi
b900: 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
b910: 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
b920: 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74  e->nShared , get
b930: 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  pid()));..  /* I
b940: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
b950: 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
b960: 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
b970: 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
b980: 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
b990: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
b9a0: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
b9b0: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
b9c0: 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
b9d0: 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
b9e0: 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
b9f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
ba00: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
ba10: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
ba20: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
ba30: 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
ba40: 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c  dy held) (unix)\
ba50: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
ba60: 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
ba70: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
ba80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
ba90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
baa0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
bab0: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
bac0: 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  e is correct..  
bad0: 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
bae0: 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
baf0: 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
bb00: 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
bb10: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
bb20: 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
bb30: 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
bb40: 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
bb50: 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
bb60: 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
bb70: 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
bb80: 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
bb90: 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
bba0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
bbb0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
bbc0: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
bbd0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
bbe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
bbf0: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
bc00: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
bc10: 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
bc20: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
bc30: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
bc40: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
bc50: 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
bc60: 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
bc70: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
bc80: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
bc90: 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
bca0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
bcb0: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
bcc0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
bcd0: 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
bce0: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
bcf0: 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
bd00: 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
bd10: 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
bd20: 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
bd30: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
bd40: 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
bd50: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
bd60: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
bd70: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
bd80: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  && .          (p
bd90: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
bda0: 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
bdb0: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
bdc0: 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
bdd0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
bde0: 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  USY;.    goto en
bdf0: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
be00: 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
be10: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
be20: 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
be30: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
be40: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
be50: 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
be60: 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
be70: 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
be80: 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
be90: 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
bea0: 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
beb0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
bec0: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
bed0: 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
bee0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
bef0: 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46  CK || pInode->eF
bf00: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
bf10: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
bf20: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
bf30: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
bf40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
bf50: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  le->eFileLock==0
bf60: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
bf70: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
bf80: 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
bf90: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
bfa0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  ED_LOCK;.    pIn
bfb0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a  ode->nShared++;.
bfc0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
bfd0: 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  k++;.    goto en
bfe0: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20  d_lock;.  }...  
bff0: 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
c000: 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
c010: 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
c020: 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
c030: 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
c040: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
c050: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
c060: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
c070: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
c080: 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
c090: 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  .  */.  lock.l_l
c0a0: 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e  en = 1L;.  lock.
c0b0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
c0c0: 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65  SET;.  if( eFile
c0d0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c0e0: 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
c0f0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
c100: 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
c110: 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
c120: 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
c130: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c140: 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
c150: 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a  ED_LOCK?F_RDLCK:
c160: 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f  F_WRLCK);.    lo
c170: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
c180: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69  DING_BYTE;.    i
c190: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
c1a0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
c1b0: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
c1c0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
c1d0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
c1e0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
c1f0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
c200: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
c210: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
c220: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  Y ){.        pFi
c230: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
c240: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
c250: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
c260: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
c270: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
c280: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
c290: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
c2a0: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
c2b0: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
c2c0: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
c2d0: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
c2e0: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
c2f0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
c300: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
c310: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c320: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a  ->nShared==0 );.
c330: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
c340: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  de->eFileLock==0
c350: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c360: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
c370: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ..    /* Now get
c380: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a   the read-lock *
c390: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
c3a0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
c3b0: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  T;.    lock.l_le
c3c0: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
c3d0: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
c3e0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
c3f0: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
c400: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
c410: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
c420: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
c430: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
c440: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
c450: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70    }..    /* Drop
c460: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
c470: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
c480: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c490: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
c4a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
c4b0: 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f   1L;.    lock.l_
c4c0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
c4d0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
c4e0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
c4f0: 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  k) && rc==SQLITE
c500: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
c510: 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65  This could happe
c520: 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b  n with a network
c530: 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20   mount */.      
c540: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
c550: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c560: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
c570: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
c580: 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
c590: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
c5a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
c5b0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
c5c0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
c5d0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
c5e0: 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
c5f0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
c600: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
c610: 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
c620: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
c630: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
c640: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
c650: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
c660: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
c670: 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
c680: 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
c690: 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
c6a0: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
c6b0: 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
c6c0: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
c6d0: 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
c6e0: 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
c6f0: 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
c700: 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
c710: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
c720: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
c730: 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
c740: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
c750: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
c760: 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
c770: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
c780: 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
c790: 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
c7a0: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
c7b0: 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
c7c0: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
c7d0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
c7e0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
c7f0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20  e = F_WRLCK;..  
c800: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
c810: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
c820: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
c830: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
c840: 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  );.    if( eFile
c850: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
c860: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  OCK ){.      loc
c870: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
c880: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20  RVED_BYTE;.     
c890: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
c8a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c8b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c8c0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
c8d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
c8e0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c8f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75      }..    if( u
c900: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
c910: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
c920: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
c930: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
c940: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
c950: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
c960: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
c970: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
c980: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
c990: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
c9a0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
c9b0: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
c9c0: 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e 64 65  }.  }.  ..#ifnde
c9d0: 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 53 65  f NDEBUG.  /* Se
c9e0: 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  t up the transac
c9f0: 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61  tion-counter cha
ca00: 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61  nge checking fla
ca10: 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61  gs when.  ** tra
ca20: 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
ca30: 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45  a SHARED to a RE
ca40: 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68  SERVED lock.  Th
ca50: 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72  e change.  ** fr
ca60: 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  om SHARED to RES
ca70: 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20  ERVED marks the 
ca80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e  beginning of a n
ca90: 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65  ormal.  ** write
caa0: 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20   operation (not 
cab0: 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f  a hot journal ro
cac0: 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20  llback)..  */.  
cad0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
cae0: 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65  K.   && pFile->e
caf0: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
cb00: 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c  _LOCK.   && eFil
cb10: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
cb20: 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46  LOCK.  ){.    pF
cb30: 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
cb40: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  ng = 0;.    pFil
cb50: 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  e->dbUpdate = 0;
cb60: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
cb70: 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20  rmalWrite = 1;. 
cb80: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66   }.#endif...  if
cb90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
cba0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
cbb0: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
cbc0: 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ock;.    pInode-
cbd0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
cbe0: 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20  leLock;.  }else 
cbf0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
cc00: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
cc10: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
cc20: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
cc30: 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
cc40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
cc50: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
cc60: 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  .end_lock:.  uni
cc70: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
cc80: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
cc90: 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69     %d %s %s (uni
cca0: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
ccb0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
ccc0: 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72  eLock), .      r
ccd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
cce0: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
ccf0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cd00: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20  ../*.** Add the 
cd10: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
cd20: 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e  used by file han
cd30: 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65  dle pFile to the
cd40: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
cd50: 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a  * pUnused list..
cd60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
cd70: 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78  etPendingFd(unix
cd80: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
cd90: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
cda0: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
cdb0: 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75  Inode;.  UnixUnu
cdc0: 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65  sedFd *p = pFile
cdd0: 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e  ->pUnused;.  p->
cde0: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
cdf0: 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64  pUnused;.  pInod
ce00: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a  e->pUnused = p;.
ce10: 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
ce20: 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  .  pFile->pUnuse
ce30: 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d = 0;.}../*.** 
ce40: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
ce50: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
ce60: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
ce70: 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
ce80: 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
ce90: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
cea0: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
ceb0: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
cec0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
ced0: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
cee0: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
cef0: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
cf00: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
cf10: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
cf20: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
cf30: 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  o-op..** .** If 
cf40: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
cf50: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e  is true, then on
cf60: 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20   downgrading an 
cf70: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74  EXCLUSIVE_LOCK t
cf80: 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20  o SHARED.** the 
cf90: 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69  byte range is di
cfa0: 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72  vided into 2 par
cfb0: 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ts and the first
cfc0: 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65   part is unlocke
cfd0: 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f  d then.** set to
cfe0: 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68   a read lock, th
cff0: 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72  en the other par
d000: 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f  t is simply unlo
d010: 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b  cked.  This work
d020: 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62  s .** around a b
d030: 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f  ug in BSD NFS lo
d040: 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f  ckd (also seen o
d050: 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20  n MacOSX 10.3+) 
d060: 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a  that fails to .*
d070: 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69  * remove the wri
d080: 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67  te lock on a reg
d090: 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20  ion when a read 
d0a0: 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  lock is set..*/.
d0b0: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
d0c0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
d0d0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
d0e0: 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64  leLock, int hand
d0f0: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20  leNFSUnlock){.  
d100: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
d110: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
d120: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
d130: 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75   *pInode;.  stru
d140: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
d150: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d160: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20  _OK;.  int h;.. 
d170: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
d180: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
d190: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
d1a0: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
d1b0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
d1c0: 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
d1d0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
d1e0: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
d1f0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d200: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
d210: 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
d220: 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
d230: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
d240: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
d250: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
d260: 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
d270: 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
d280: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
d290: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
d2a0: 78 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65  x();.  h = pFile
d2b0: 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  ->h;.  pInode = 
d2c0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
d2d0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
d2e0: 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
d2f0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
d300: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
d310: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
d320: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
d330: 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
d340: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
d350: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
d360: 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
d370: 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
d380: 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
d390: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
d3a0: 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
d3b0: 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
d3c0: 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
d3d0: 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
d3e0: 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
d3f0: 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
d400: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
d410: 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
d420: 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
d430: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
d440: 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
d450: 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
d460: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
d470: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
d480: 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
d490: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
d4a0: 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
d4b0: 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
d4c0: 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
d4d0: 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
d4e0: 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
d4f0: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
d500: 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
d510: 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
d520: 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
d530: 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
d540: 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
d550: 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
d560: 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
d570: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
d580: 20 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20     */.#if 0.    
d590: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
d5a0: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
d5b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
d5c0: 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
d5d0: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
d5e0: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
d5f0: 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =1 );.#endif.   
d600: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
d610: 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
d620: 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
d630: 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
d640: 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
d650: 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
d660: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
d670: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
d680: 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
d690: 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
d6a0: 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
d6b0: 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
d6c0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
d6d0: 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
d6e0: 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
d6f0: 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
d700: 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
d710: 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
d720: 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
d730: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
d740: 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
d750: 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
d760: 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
d770: 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
d780: 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
d790: 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
d7a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c   */.    if( eFil
d7b0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d7c0: 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65 66 69  CK ){..#if !defi
d7d0: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
d7e0: 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | !SQLITE_ENABLE
d7f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
d800: 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c       (void)handl
d810: 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20  eNFSUnlock;.    
d820: 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65    assert( handle
d830: 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a  NFSUnlock==0 );.
d840: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
d850: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
d860: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
d870: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
d880: 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
d890: 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
d8a0: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
d8c0: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
d8d0: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
d8e0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66  s */.        off
d8f0: 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
d900: 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
d910: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
d920: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
d930: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
d940: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
d950: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
d960: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
d970: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
d980: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
d990: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
d9a0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
d9b0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
d9c0: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
d9d0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
d9e0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
d9f0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
da00: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
da10: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
da20: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
da30: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
da40: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
da50: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
da60: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
da70: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
da80: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
da90: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
daa0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
dab0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
dac0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
dad0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
dae0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
daf0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
db00: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
db10: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
db20: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
db30: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
db40: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
db50: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
db60: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
db70: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
db80: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
db90: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
dba0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
dbb0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
dbc0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
dbd0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
dbe0: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
dbf0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
dc00: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
dc10: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
dc20: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
dc30: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
dc40: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
dc50: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
dc60: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
dc70: 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
dc80: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
dc90: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
dca0: 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
dcb0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
dcc0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
dcd0: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
dce0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
dcf0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
dd00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
dd10: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
dd20: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
dd30: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
dd40: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
dd50: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
dd60: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
dd70: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
dd80: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
dd90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
dda0: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
ddb0: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
ddc0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
ddd0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
dde0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
ddf0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
de00: 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  RDLCK;.        l
de10: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
de20: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
de30: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
de40: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
de50: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
de60: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
de70: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
de80: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
de90: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
dea0: 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79      /* In theory
deb0: 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  , the call to un
dec0: 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e  ixFileLock() can
ded0: 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65  not fail because
dee0: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20   another.       
def0: 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73     ** process is
df00: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f   holding an inco
df10: 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49  mpatible lock. I
df20: 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20  f it does, this 
df30: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
df40: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
df50: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
df60: 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20  s not following 
df70: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20  the locking.    
df80: 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f        ** protoco
df90: 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  l. If this happe
dfa0: 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
dfb0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20  E_IOERR_RDLOCK. 
dfc0: 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20  Returning.      
dfd0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
dfe0: 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65  SY would confuse
dff0: 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
e000: 20 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74   (in practice it
e010: 20 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20   causes .       
e020: 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20     ** an assert 
e030: 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20  to fail). */ .  
e040: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e050: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
e060: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  ;.          pFil
e070: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
e080: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e090: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
e0a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e0b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
e0c0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
e0d0: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
e0e0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
e0f0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
e100: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
e110: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
e120: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
e130: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
e140: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
e150: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
e160: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
e170: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
e180: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
e190: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
e1a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e1b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
e1c0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
e1d0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
e1e0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e1f0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
e200: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
e210: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  if( eFileLock==N
e220: 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
e230: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
e240: 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
e250: 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
e260: 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
e270: 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
e280: 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
e290: 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
e2a0: 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
e2b0: 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
e2c0: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
e2d0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
e2e0: 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
e2f0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
e300: 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
e310: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
e320: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
e330: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
e340: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
e350: 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
e360: 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d   = 0L;.      Sim
e370: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
e380: 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d  gn(1);.      Sim
e390: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
e3a0: 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d  (-1) ).      Sim
e3b0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
e3c0: 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
e3d0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e3e0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
e3f0: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
e400: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
e410: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
e420: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
e430: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
e440: 4c 4f 43 4b 3b 0a 09 70 46 69 6c 65 2d 3e 6c 61  LOCK;..pFile->la
e450: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
e460: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
e470: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
e480: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
e490: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
e4a0: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
e4b0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
e4c0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
e4d0: 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61  unt of locks aga
e4e0: 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66  inst this same f
e4f0: 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20  ile.  When the. 
e500: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63     ** count reac
e510: 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20  hes zero, close 
e520: 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64  any other file d
e530: 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65  escriptors whose
e540: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61   close.    ** wa
e550: 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75  s deferred becau
e560: 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  se of outstandin
e570: 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a  g locks..    */.
e580: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
e590: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
e5a0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
e5b0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
e5c0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
e5d0: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
e5e0: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
e5f0: 20 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75     }.  }...end_u
e600: 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  nlock:.  unixLea
e610: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
e620: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e630: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e640: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
e650: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e660: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
e670: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
e680: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
e690: 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
e6a0: 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
e6b0: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
e6c0: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
e6d0: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
e6e0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
e6f0: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
e700: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
e710: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
e720: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
e730: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
e740: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
e750: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
e760: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c  atic int unixUnl
e770: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e780: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
e790: 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ock){.  return p
e7a0: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
e7b0: 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
e7c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e7d0: 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
e7e0: 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
e7f0: 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
e800: 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
e810: 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
e820: 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
e830: 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
e840: 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
e850: 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
e860: 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
e870: 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
e880: 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
e890: 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
e8a0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74  **.** It is *not
e8b0: 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68  * necessary to h
e8c0: 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68  old the mutex wh
e8d0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
e8e0: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76  is called,.** ev
e8f0: 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20  en on VxWorks.  
e900: 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20  A mutex will be 
e910: 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f  acquired on VxWo
e920: 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78  rks by the.** vx
e930: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
e940: 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  Id() routine..*/
e950: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
e960: 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65  eUnixFile(sqlite
e970: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
e980: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
e990: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
e9a0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
e9b0: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62  fd>=0 ){.    rob
e9c0: 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
e9d0: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 20 5f   pFile->dirfd, _
e9e0: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46  _LINE__);.    pF
e9f0: 69 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20  ile->dirfd=-1;. 
ea00: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
ea10: 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75  h>=0 ){.    robu
ea20: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
ea30: 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  pFile->h, __LINE
ea40: 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  __);.    pFile->
ea50: 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20  h = -1;.  }.#if 
ea60: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
ea70: 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20   pFile->pId ){. 
ea80: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
ea90: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
eaa0: 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49  unlink(pFile->pI
eab0: 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
eac0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78  e);.    }.    vx
ead0: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
eae0: 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a  Id(pFile->pId);.
eaf0: 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d      pFile->pId =
eb00: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
eb10: 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
eb20: 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
eb30: 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f  e->h));.  OpenCo
eb40: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
eb50: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
eb60: 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d  >pUnused);.  mem
eb70: 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
eb80: 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
eb90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
eba0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
ebb0: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
ebc0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
ebd0: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
ebe0: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20   *id){.  int rc 
ebf0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
ec00: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
ec10: 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
ec20: 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64  .  unixUnlock(id
ec30: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e  , NO_LOCK);.  un
ec40: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
ec50: 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70  .  /* unixFile.p
ec60: 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20  Inode is always 
ec70: 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65  valid here. Othe
ec80: 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65  rwise, a differe
ec90: 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f  nt close.  ** ro
eca0: 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f  utine (e.g. nolo
ecb0: 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64  ckClose()) would
ecc0: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
ecd0: 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ad..  */.  asser
ece0: 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  t( pFile->pInode
ecf0: 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69  ->nLock>0 || pFi
ed00: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  le->pInode->bPro
ed10: 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  cessLock==0 );. 
ed20: 20 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c   if( ALWAYS(pFil
ed30: 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46  e->pInode) && pF
ed40: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
ed50: 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ck ){.    /* If 
ed60: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
ed70: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
ed80: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
ed90: 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
eda0: 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61  .    ** yet beca
edb0: 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
edc0: 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
edd0: 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
ede0: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
edf0: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
ee00: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69  node->pUnused li
ee10: 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  st.  It will be 
ee20: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
ee30: 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65  osed .    ** whe
ee40: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  n the last lock 
ee50: 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
ee60: 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e  */.    setPendin
ee70: 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  gFd(pFile);.  }.
ee80: 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
ee90: 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20  fo(pFile);.  rc 
eea0: 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
eeb0: 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  id);.  unixLeave
eec0: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
eed0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  n rc;.}../******
eee0: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
eef0: 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  the posix adviso
ef00: 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ry lock implemen
ef10: 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
ef20: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
ef30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef70: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
ef80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
efd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efe0: 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c  ******** No-op L
eff0: 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
f000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
f020: 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  Of the various l
f030: 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
f040: 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65  ations available
f050: 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72  , this is by far
f060: 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74   the.** simplest
f070: 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67  :  locking is ig
f080: 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d  nored.  No attem
f090: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f  pt is made to lo
f0a0: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
f0b0: 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  ** file for read
f0c0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a  ing or writing..
f0d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69  **.** This locki
f0e0: 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f  ng mode is appro
f0f0: 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f  priate for use o
f100: 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  n read-only data
f110: 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61  bases.** (ex: da
f120: 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65  tabases that are
f130: 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d   burned into CD-
f140: 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ROM, for example
f150: 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c  .)  It can.** al
f160: 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68  so be used if th
f170: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d  e application em
f180: 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72  ploys some exter
f190: 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f  nal mechanism to
f1a0: 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75  .** prevent simu
f1b0: 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20  ltaneous access 
f1c0: 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  of the same data
f1d0: 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d  base by two or m
f1e0: 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ore.** database 
f1f0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75  connections.  Bu
f200: 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72  t there is a ser
f210: 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74  ious risk of dat
f220: 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74  abase.** corrupt
f230: 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b  ion if this lock
f240: 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
f250: 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77   in situations w
f260: 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  here multiple.**
f270: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
f280: 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73  tions are access
f290: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
f2a0: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
f2b0: 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61  e same.** time a
f2c0: 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  nd one or more o
f2d0: 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
f2e0: 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e  ons are writing.
f2f0: 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
f300: 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
f310: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
f320: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
f330: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
f340: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
f350: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52  (NotUsed);.  *pR
f360: 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74  esOut = 0;.  ret
f370: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f380: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
f390: 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
f3a0: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
f3b0: 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
f3c0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
f3d0: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
f3e0: 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
f3f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
f400: 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f  c int nolockUnlo
f410: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f420: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
f430: 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
f440: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
f450: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
f460: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f470: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
f480: 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ose the file..*/
f490: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
f4a0: 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
f4b0: 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65  file *id) {.  re
f4c0: 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
f4d0: 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  le(id);.}../****
f4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
f4f0: 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70  End of the no-op
f500: 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
f510: 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
f520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
f530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
f5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5e0: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d  ***** Begin dot-
f5f0: 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  file Locking ***
f600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
f620: 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f  * The dotfile lo
f630: 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
f640: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78  tion uses the ex
f650: 69 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72  istance of separ
f660: 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65  ate lock.** file
f670: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  s in order to co
f680: 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20  ntrol access to 
f690: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
f6a0: 68 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73  his works on jus
f6b0: 74 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79  t.** about every
f6c0: 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67   filesystem imag
f6d0: 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65  inable.  But the
f6e0: 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64  re are serious d
f6f0: 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20  ownsides:.**.** 
f700: 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73     (1)  There is
f710: 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63   zero concurrenc
f720: 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61  y.  A single rea
f730: 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f  der blocks all o
f740: 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  ther.**         
f750: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  connections from
f760: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
f770: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
f780: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
f790: 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  An application c
f7a0: 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f  rash or power lo
f7b0: 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61  ss can leave sta
f7c0: 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a  le lock files.**
f7d0: 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67           sitting
f7e0: 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65   around that nee
f7f0: 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20  d to be cleared 
f800: 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  manually..**.** 
f810: 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20  Nevertheless, a 
f820: 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70  dotlock is an ap
f830: 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
f840: 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69  g mode for use i
f850: 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f  f no.** other lo
f860: 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69  cking strategy i
f870: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  s available..**.
f880: 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  ** Dotfile locki
f890: 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61  ng works by crea
f8a0: 74 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74  ting a file in t
f8b0: 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
f8c0: 79 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61  y as the.** data
f8d0: 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
f8e0: 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
f8f0: 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
f900: 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
f910: 2a 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65  ** The existance
f920: 20 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20   of a lock file 
f930: 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55  implies an EXCLU
f940: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20  SIVE lock.  All 
f950: 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79  other lock.** ty
f960: 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53  pes (SHARED, RES
f970: 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20  ERVED, PENDING) 
f980: 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  are mapped into 
f990: 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f  EXCLUSIVE..*/../
f9a0: 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75  *.** The file su
f9b0: 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68  ffix added to th
f9c0: 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65  e data base file
f9d0: 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  name in order to
f9e0: 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c   create the.** l
f9f0: 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65  ock file..*/.#de
fa00: 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  fine DOTLOCK_SUF
fa10: 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a  FIX ".lock"../*.
fa20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fa30: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
fa40: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
fa50: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
fa60: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
fa70: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
fa80: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
fa90: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
faa0: 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
fab0: 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
fac0: 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
fad0: 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
fae0: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
faf0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
fb00: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
fb10: 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
fb20: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
fb30: 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
fb40: 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ecking..**.** In
fb50: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
fb60: 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20  , either a lock 
fb70: 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65  exists or it doe
fb80: 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68  s not.  So in th
fb90: 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20  is.** variation 
fba0: 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64  of CheckReserved
fbb0: 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74  Lock(), *pResOut
fbc0: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
fbd0: 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69  if any lock.** i
fbe0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  s held on the fi
fbf0: 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  le and false if 
fc00: 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
fc10: 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cked..*/.static 
fc20: 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  int dotlockCheck
fc30: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
fc40: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
fc50: 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
fc60: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
fc70: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
fc80: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
fc90: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
fca0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
fcb0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
fcc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
fcd0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
fce0: 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
fcf0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
fd00: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
fd10: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
fd20: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
fd30: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
fd40: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
fd50: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
fd60: 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
fd70: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
fd80: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   or some other c
fd90: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65  onnection in the
fda0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20   same process.  
fdb0: 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63    ** holds a loc
fdc0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  k on the file.  
fdd0: 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  No need to check
fde0: 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
fdf0: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
fe00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
fe10: 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  he lock is held 
fe20: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74  if and only if t
fe30: 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73  he lockfile exis
fe40: 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ts */.    const 
fe50: 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
fe60: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
fe70: 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
fe80: 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76  text;.    reserv
fe90: 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c  ed = osAccess(zL
fea0: 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a  ockFile, 0)==0;.
feb0: 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
fec0: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
fed0: 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  %d %d (dotlock)\
fee0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
fef0: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
ff00: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
ff10: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
ff20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
ff30: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
ff40: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
ff50: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
ff60: 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
ff70: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
ff80: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
ff90: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
ffa0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
ffb0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
ffc0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
ffd0: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
ffe0: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
fff0: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
10000 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
10010 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
10020 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
10030 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
10040 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
10050 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
10060 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
10070 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
10080 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
10090 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
100a0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
100b0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
100c0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
100d0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
100e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
100f0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
10100 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
10110 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
10120 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
10130 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
10140 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
10150 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
10160 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
10170 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
10180 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
10190 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
101a0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
101b0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
101c0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
101d0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
101e0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
101f0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
10200 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
10210 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
10220 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
10230 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
10240 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
10250 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
10260 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
10270 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
10280 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
10290 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
102a0 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
102b0 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
102c0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
102d0 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
102e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
102f0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
10300 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10310 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10320 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  id;.  int fd;.  
10330 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
10340 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
10350 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
10360 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10370 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
10380 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
10390 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
103a0 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
103b0 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
103c0 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
103d0 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
103e0 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
103f0 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
10400 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
10410 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
10420 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
10430 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
10440 46 69 6c 65 4c 6f 63 6b 3b 0a 23 69 66 20 21 4f  FileLock;.#if !O
10450 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f 2a  S_VXWORKS.    /*
10460 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
10470 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
10480 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
10490 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b      utimes(zLock
104a0 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e  File, NULL);.#en
104b0 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
104c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
104d0 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
104e0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
104f0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
10500 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52  en(zLockFile,O_R
10510 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f  DONLY|O_CREAT|O_
10520 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66  EXCL,0600);.  if
10530 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( fd<0 ){.    /*
10540 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
10550 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c  create the file,
10560 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61   someone else ma
10570 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68  y have stolen th
10580 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
10590 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
105a0 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54  ;.    if( EEXIST
105b0 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   == tErrno ){.  
105c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
105d0 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65  BUSY;.    } else
105e0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
105f0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
10600 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
10610 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
10620 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  K);.      if( IS
10630 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
10640 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
10650 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
10660 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
10670 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
10680 63 3b 0a 20 20 7d 20 0a 20 20 72 6f 62 75 73 74  c;.  } .  robust
10690 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64  _close(pFile, fd
106a0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 0a  , __LINE__);.  .
106b0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
106c0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
106d0 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
106e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
106f0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
10700 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10710 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
10720 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
10730 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
10740 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
10750 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
10760 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
10770 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
10780 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
10790 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
107a0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
107b0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
107c0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
107d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
107e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
107f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10800 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
10810 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
10820 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
10830 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
10840 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
10850 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
10860 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
10870 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
10880 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
10890 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
108a0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
108b0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
108c0 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
108d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
108e0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
108f0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
10900 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
10910 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
10920 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
10930 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09  >h, eFileLock,..
10940 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10950 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
10960 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
10970 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
10980 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
10990 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
109a0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
109b0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
109c0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
109d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
109e0 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72  ..  /* To downgr
109f0 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73  ade to shared, s
10a00 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72  imply update our
10a10 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e   internal notion
10a20 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63   of the.  ** loc
10a30 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65  k state.  No nee
10a40 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74  d to mess with t
10a50 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
10a60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
10a70 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
10a80 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
10a90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
10aa0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65  RED_LOCK;.    re
10ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10ac0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66    }.  .  /* To f
10ad0 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20  ully unlock the 
10ae0 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65  database, delete
10af0 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a   the lock file *
10b00 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  /.  assert( eFil
10b10 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
10b20 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28 7a  ;.  if( unlink(z
10b30 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20 20  LockFile) ){.   
10b40 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20   int rc = 0;.   
10b50 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
10b60 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f  rno;.    if( ENO
10b70 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  ENT != tErrno ){
10b80 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
10b90 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
10ba0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
10bb0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
10bc0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
10bd0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
10be0 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
10bf0 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
10c00 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
10c10 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
10c20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10c40 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75  a file.  Make su
10c50 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  re the lock has 
10c60 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65  been released be
10c70 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f  fore closing..*/
10c80 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
10c90 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
10ca0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
10cb0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20  nt rc;.  if( id 
10cc0 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
10cd0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10ce0 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c  le*)id;.    dotl
10cf0 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
10d00 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69  _LOCK);.    sqli
10d10 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
10d20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
10d30 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73  .  }.  rc = clos
10d40 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
10d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a   return rc;.}./*
10d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d70 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74  * End of the dot
10d80 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  -file lock imple
10d90 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
10da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
10e70 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a  flock Locking **
10e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10ea0 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f  *.** Use the flo
10eb0 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  ck() system call
10ec0 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b   to do file lock
10ed0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  ing..**.** flock
10ee0 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  () locking is li
10ef0 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  ke dot-file lock
10f00 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20  ing in that the 
10f10 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d  various.** fine-
10f20 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65  grain locking le
10f30 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62  vels supported b
10f40 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c  y SQLite are col
10f50 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61  lapsed into.** a
10f60 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76   single exclusiv
10f70 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65  e lock.  In othe
10f80 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c  r words, SHARED,
10f90 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a   RESERVED, and.*
10fa0 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20  * PENDING locks 
10fb0 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69  are the same thi
10fc0 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49  ng as an EXCLUSI
10fd0 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65  VE lock.  SQLite
10fe0 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20  .** still works 
10ff0 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73  when you do this
11000 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63  , but concurrenc
11010 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e  y is reduced sin
11020 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  ce.** only a sin
11030 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
11040 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  be reading the d
11050 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d  atabase at a tim
11060 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68  e..**.** Omit th
11070 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51  is section if SQ
11080 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
11090 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72  ING_STYLE is tur
110a0 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a  ned off or if.**
110b0 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56   compiling for V
110c0 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53  XWORKS..*/.#if S
110d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
110e0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
110f0 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
11100 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63   Retry flock() c
11110 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77  alls that fail w
11120 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66  ith EINTR.*/.#if
11130 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63  def EINTR.static
11140 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63   int robust_floc
11150 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  k(int fd, int op
11160 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
11170 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64  o{ rc = flock(fd
11180 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  ,op); }while( rc
11190 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
111a0 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  TR );.  return r
111b0 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  c;.}.#else.# def
111c0 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  ine robust_flock
111d0 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29  (a,b) flock(a,b)
111e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f  .#endif.     ../
111f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11200 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
11210 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
11220 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
11230 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
11240 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
11250 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
11260 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
11270 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
11280 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
11290 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
112a0 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
112b0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
112c0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
112d0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
112e0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
112f0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
11300 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
11310 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
11320 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65  tic int flockChe
11330 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
11340 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11350 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
11360 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11370 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
11380 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
11390 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
113a0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
113b0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
113c0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
113d0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
113e0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
113f0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11400 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  );.  .  /* Check
11410 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
11420 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
11430 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
11440 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
11450 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
11460 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
11470 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
11480 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
11490 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
114a0 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
114b0 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
114c0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
114d0 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20   attempt to get 
114e0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
114f0 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74  int lrc = robust
11500 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
11510 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
11520 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72  NB);.    if( !lr
11530 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f  c ){.      /* go
11540 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  t the lock, unlo
11550 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c  ck it */.      l
11560 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
11570 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
11580 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28  _UN);.      if (
11590 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20   lrc ) {.       
115a0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
115b0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  rno;.        /* 
115c0 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69  unlock failed wi
115d0 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  th an error */. 
115e0 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c         lrc = SQL
115f0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
11600 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ; .        if( I
11610 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
11620 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
11630 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11640 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
11650 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
11660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11670 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
11680 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
11690 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73  errno;.      res
116a0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
116b0 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
116c0 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72   might have it r
116d0 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20  eserved */.     
116e0 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
116f0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11700 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11710 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20  IOERR_LOCK); .  
11720 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
11730 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
11740 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
11750 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
11760 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72  .        rc = lr
11770 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
11780 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
11790 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
117a0 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e   %d %d (flock)\n
117b0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
117c0 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69   reserved));..#i
117d0 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
117e0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
117f0 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
11800 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
11810 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
11820 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
11830 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76  E_OK;.    reserv
11840 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed=1;.  }.#endif
11850 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
11860 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
11870 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75  ORS */.  *pResOu
11880 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
11890 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
118a0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
118b0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
118c0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
118d0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
118e0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
118f0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
11900 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
11910 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
11920 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
11930 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
11940 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
11950 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
11960 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
11970 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
11980 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
11990 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
119a0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
119b0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
119c0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
119d0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
119e0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
119f0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
11a00 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
11a10 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
11a20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
11a30 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
11a40 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
11a50 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
11a60 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
11a70 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
11a80 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
11a90 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
11aa0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
11ab0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
11ac0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
11ad0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
11ae0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
11af0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11b00 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11b10 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
11b20 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
11b30 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
11b40 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
11b50 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f  .**.** flock() o
11b60 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
11b70 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
11b80 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
11b90 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
11ba0 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
11bb0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
11bc0 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
11bd0 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
11be0 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
11bf0 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
11c00 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
11c10 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
11c20 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
11c30 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
11c40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11c50 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
11c60 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
11c70 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
11c80 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
11c90 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
11ca0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
11cb0 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c  tatic int flockL
11cc0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
11cd0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
11ce0 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
11cf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11d00 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11d10 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11d20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11d30 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20   );..  /* if we 
11d40 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
11d50 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
11d60 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
11d70 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
11d80 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
11d90 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
11da0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11db0 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
11dc0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11dd0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
11de0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11df0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
11e00 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
11e10 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20  ive lock */.  . 
11e20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63   if (robust_floc
11e30 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
11e40 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20  _EX | LOCK_NB)) 
11e50 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  {.    int tErrno
11e60 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a   = errno;.    /*
11e70 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73   didn't get, mus
11e80 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20  t be busy */.   
11e90 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
11ea0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
11eb0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
11ec0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
11ed0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
11ee0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
11ef0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11f00 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
11f10 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f    } else {.    /
11f20 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
11f30 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
11f40 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c  n ok */.    pFil
11f50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
11f60 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  FileLock;.  }.  
11f70 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
11f80 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63    %d %s %s (floc
11f90 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
11fa0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
11fb0 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20  eLock), .       
11fc0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
11fd0 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
11fe0 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51  ed"));.#ifdef SQ
11ff0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
12000 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
12010 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
12020 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
12030 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
12040 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
12050 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
12060 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
12070 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
12080 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
12090 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  .../*.** Lower t
120a0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
120b0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
120c0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
120d0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
120e0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
120f0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
12100 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
12110 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
12120 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
12130 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
12140 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
12150 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
12160 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
12170 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
12180 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
12190 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
121a0 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
121b0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
121c0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
121d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
121e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
121f0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
12200 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
12210 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
12220 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c  as %d pid=%d (fl
12230 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
12240 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
12250 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
12260 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69  eFileLock, getpi
12270 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  d()));.  assert(
12280 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
12290 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
122a0 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
122b0 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
122c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
122d0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
122e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
122f0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
12300 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
12310 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
12320 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
12330 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
12340 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
12350 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
12360 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12370 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
12380 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12390 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
123a0 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c   no, really, unl
123b0 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f  ock. */.  if( ro
123c0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
123d0 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b  ->h, LOCK_UN) ){
123e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
123f0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
12400 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75  _ERRORS.    retu
12410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
12420 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
12430 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
12440 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72  _ERRORS */.    r
12450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12460 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c  RR_UNLOCK;.  }el
12470 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  se{.    pFile->e
12480 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
12490 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
124a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
124b0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
124c0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
124d0 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  nt flockClose(sq
124e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
124f0 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
12500 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64    flockUnlock(id
12510 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  , NO_LOCK);.  }.
12520 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
12530 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23  ixFile(id);.}..#
12540 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12550 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12560 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
12570 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RK */../********
12580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
12590 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63  of the flock loc
125a0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
125b0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
125c0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
125d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12610 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d   Begin Named Sem
12690 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a  aphore Locking *
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61  *******.**.** Na
126c0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
126d0 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75  cking is only su
126e0 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72  pported on VxWor
126f0 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  ks..**.** Semaph
12700 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  ore locking is l
12710 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64  ike dot-lock and
12720 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69   flock in that i
12730 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a  t really only.**
12740 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53   supports EXCLUS
12750 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e  IVE locking.  On
12760 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
12770 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20  ess can read or 
12780 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74  write.** the dat
12790 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20  abase file at a 
127a0 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75  time.  This redu
127b0 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f  ces potential co
127c0 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a  ncurrency, but.*
127d0 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b  * makes the lock
127e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
127f0 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a  much easier..*/.
12800 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a  #if OS_VXWORKS..
12810 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12820 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
12830 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
12840 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
12850 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
12860 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
12870 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
12880 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
12890 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
128a0 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
128b0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
128c0 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
128d0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
128e0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
128f0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
12900 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
12910 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
12920 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
12930 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
12940 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63  atic int semChec
12950 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12960 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12970 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
12980 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12990 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
129a0 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
129b0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
129c0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
129d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
129e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
129f0 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
12a00 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
12a10 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
12a20 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
12a30 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
12a40 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
12a50 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
12a60 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
12a70 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
12a80 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
12a90 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
12aa0 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
12ab0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
12ac0 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
12ad0 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
12ae0 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20  ed ){.    sem_t 
12af0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
12b00 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 20  Inode->pSem;.   
12b10 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
12b20 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20 73  tBuf;..    if( s
12b30 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
12b40 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ==-1 ){.      in
12b50 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
12b60 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41  ;.      if( EAGA
12b70 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  IN != tErrno ){.
12b80 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12b90 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
12ba0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
12bb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
12bc0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a  KRESERVEDLOCK);.
12bd0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
12be0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
12bf0 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  o;.      } else 
12c00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d  {.        /* som
12c10 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68  eone else has th
12c20 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61  e lock when we a
12c30 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f  re in NO_LOCK */
12c40 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65  .        reserve
12c50 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  d = (pFile->eFil
12c60 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c  eLock < SHARED_L
12c70 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
12c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
12c90 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20  * we could have 
12ca0 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74  it if we want it
12cb0 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f   */.      sem_po
12cc0 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a  st(pSem);.    }.
12cd0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
12ce0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
12cf0 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20  %d %d (sem)\n", 
12d00 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
12d10 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52  served));..  *pR
12d20 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
12d30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12d40 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
12d50 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
12d60 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
12d70 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
12d80 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
12d90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
12da0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
12db0 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
12dc0 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
12dd0 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
12de0 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
12df0 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
12e00 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
12e10 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
12e20 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
12e30 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
12e40 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
12e50 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
12e60 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
12e70 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
12e80 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
12e90 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
12ea0 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
12eb0 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
12ec0 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
12ed0 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
12ee0 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
12ef0 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
12f00 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
12f10 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
12f20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
12f30 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
12f40 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
12f50 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
12f60 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
12f70 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
12f80 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
12f90 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
12fa0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
12fb0 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
12fc0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
12fd0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
12fe0 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
12ff0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  SIVE.**.** Semap
13000 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20  hore locks only 
13010 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
13020 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
13030 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
13040 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
13050 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
13060 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
13070 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
13080 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
13090 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
130a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
130b0 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
130c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
130d0 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
130e0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
130f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
13100 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
13110 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
13120 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
13130 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
13140 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
13150 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
13160 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71  c int semLock(sq
13170 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13180 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
13190 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
131a0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
131b0 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  id;.  int fd;.  
131c0 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
131d0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
131e0 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  m;.  int rc = SQ
131f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69  LITE_OK;..  /* i
13200 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
13210 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
13220 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
13230 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
13240 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
13250 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
13260 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c   if (pFile->eFil
13270 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  eLock > NO_LOCK)
13280 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
13290 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
132a0 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ock;.    rc = SQ
132b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
132c0 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
132d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b    }.  .  /* lock
132e0 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62   semaphore now b
132f0 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e  ut bail out when
13300 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e   already locked.
13310 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72   */.  if( sem_tr
13320 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
13330 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
13340 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
13350 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
13360 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74    }..  /* got it
13370 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
13380 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
13390 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
133a0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
133b0 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a  . sem_end_lock:.
133c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
133d0 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
133e0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
133f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
13400 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
13410 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
13420 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
13430 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
13440 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
13450 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
13460 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
13470 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
13480 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
13490 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
134a0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
134b0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
134c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
134d0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c  tatic int semUnl
134e0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
134f0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
13500 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
13510 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
13520 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
13530 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
13540 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a  >pInode->pSem;..
13550 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  );.  assert( pSe
13570 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  m );.  OSTRACE((
13580 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
13590 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65  as %d pid=%d (se
135a0 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
135b0 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20   eFileLock,..   
135c0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
135d0 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
135e0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
135f0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
13600 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
13610 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
13620 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
13630 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
13640 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13650 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13660 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
13670 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
13680 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
13690 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
136a0 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
136b0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
136c0 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
136d0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
136e0 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
136f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13700 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
13710 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ly unlock. */.  
13720 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53  if ( sem_post(pS
13730 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  em)==-1 ) {.    
13740 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d  int rc, tErrno =
13750 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
13760 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
13770 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
13780 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
13790 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
137a0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
137b0 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
137c0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
137d0 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
137e0 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
137f0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
13800 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
13810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13820 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f  K;.}../*. ** Clo
13830 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73  se a file.. */.s
13840 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f  tatic int semClo
13850 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
13860 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
13870 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
13880 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13890 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55  le*)id;.    semU
138a0 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
138b0 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  K);.    assert( 
138c0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69  pFile );.    uni
138d0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
138e0 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49     releaseInodeI
138f0 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nfo(pFile);.    
13900 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
13910 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46  ;.    closeUnixF
13920 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72  ile(id);.  }.  r
13930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13940 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  .}..#endif /* OS
13950 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a  _VXWORKS */./*.*
13960 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
13970 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
13980 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56  y available on V
13990 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  xWorks..**.*****
139a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
139b0 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  f the named sema
139c0 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  phore lock imple
139d0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
139e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
139f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
13a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
13a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13aa0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41  ******** Begin A
13ab0 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  FP Locking *****
13ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
13ae0 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70  ** AFP is the Ap
13af0 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f  ple Filing Proto
13b00 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e  col.  AFP is a n
13b10 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65  etwork filesyste
13b20 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70  m found.** on Ap
13b30 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f  ple Macintosh co
13b40 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f  mputers - both O
13b50 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a  S9 and OSX..**.*
13b60 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d  * Third-party im
13b70 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
13b80 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62   AFP are availab
13b90 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f  le.  But this co
13ba0 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20  de here.** only 
13bb0 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f  works on OSX..*/
13bc0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
13bd0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
13be0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
13bf0 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68  G_STYLE./*.** Th
13c00 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
13c10 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f  ext structure co
13c20 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c  ntains all afp l
13c30 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61  ock specific sta
13c40 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  te.*/.typedef st
13c50 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
13c60 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e  ontext afpLockin
13c70 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
13c80 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13c90 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72  xt {.  int reser
13ca0 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ved;.  const cha
13cb0 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
13cc0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
13cd0 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
13ce0 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79  */.};..struct By
13cf0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b  teRangeLockPB2.{
13d00 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
13d10 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20   long offset;   
13d20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74       /* offset t
13d30 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
13d40 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
13d50 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
13d60 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  gth;        /* n
13d70 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  br of bytes to l
13d80 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
13d90 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52  d long long retR
13da0 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62  angeStart; /* nb
13db0 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f  r of 1st byte lo
13dc0 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66  cked if successf
13dd0 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ul */.  unsigned
13de0 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67   char unLockFlag
13df0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d  ;         /* 1 =
13e00 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63   unlock, 0 = loc
13e10 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
13e20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61  char startEndFla
13e30 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65  g;       /* 1=re
13e40 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b  l to end of fork
13e50 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74  , 0=rel to start
13e60 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20   */.  int fd;   
13e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e80 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20          /* file 
13e90 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68  desc to assoc th
13ea0 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a  is lock with */.
13eb0 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66  };..#define afpf
13ec0 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46  sByteRangeLock2F
13ed0 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57  SCTL        _IOW
13ee0 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63  R('z', 23, struc
13ef0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
13f00 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  B2)../*.** This 
13f10 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72  is a utility for
13f20 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61   setting or clea
13f30 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65  ring a bit-range
13f40 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41   lock on an.** A
13f50 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a  FP filesystem..*
13f60 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  * .** Return SQL
13f70 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
13f80 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  s, SQLITE_BUSY o
13f90 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
13fa0 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c  atic int afpSetL
13fb0 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ock(.  const cha
13fc0 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20  r *path,        
13fd0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
13fe0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
13ff0 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b  locked or unlock
14000 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ed */.  unixFile
14010 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
14020 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
14030 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
14040 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69  n path */.  unsi
14050 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
14060 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69  ffset,     /* Fi
14070 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c  rst byte to be l
14080 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  ocked */.  unsig
14090 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
140a0 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  ngth,     /* Num
140b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
140c0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65  lock */.  int se
140d0 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20  tLockFlag       
140e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
140f0 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46   to set lock.  F
14100 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f  alse to clear lo
14110 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ck */.){.  struc
14120 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
14130 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72  B2 pb;.  int err
14140 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b  ;.  .  pb.unLock
14150 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c  Flag = setLockFl
14160 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62  ag ? 0 : 1;.  pb
14170 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20  .startEndFlag = 
14180 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d  0;.  pb.offset =
14190 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65   offset;.  pb.le
141a0 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a  ngth = length; .
141b0 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d    pb.fd = pFile-
141c0 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45  >h;.  .  OSTRACE
141d0 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25  (("AFPSETLOCK [%
141e0 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72  s] for %d%s in r
141f0 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e  ange %llx:%llx\n
14200 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b  ", .    (setLock
14210 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29  Flag?"ON":"OFF")
14220 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e  , pFile->h, (pb.
14230 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c  fd==-1?"[testval
14240 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66  -1]":""),.    of
14250 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a  fset, length));.
14260 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61    err = fsctl(pa
14270 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e  th, afpfsByteRan
14280 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70  geLock2FSCTL, &p
14290 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72  b, 0);.  if ( er
142a0 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e  r==-1 ) {.    in
142b0 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45  t rc;.    int tE
142c0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
142d0 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53    OSTRACE(("AFPS
142e0 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f  ETLOCK failed to
142f0 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64   fsctl() '%s' %d
14300 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
14310 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e       path, tErrn
14320 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72  o, strerror(tErr
14330 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51  no)));.#ifdef SQ
14340 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f  LITE_IGNORE_AFP_
14350 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
14360 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
14370 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  ;.#else.    rc =
14380 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
14390 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
143a0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
143b0 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c         setLockFl
143c0 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  ag ? SQLITE_IOER
143d0 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f  R_LOCK : SQLITE_
143e0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23  IOERR_UNLOCK);.#
143f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14400 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
14410 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66  ERRORS */.    if
14420 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
14430 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
14440 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
14450 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
14460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
14470 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
14480 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14490 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
144a0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
144b0 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
144c0 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
144d0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
144e0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
144f0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
14500 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
14510 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
14520 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
14530 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
14540 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
14550 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
14560 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
14570 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
14580 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
14590 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
145a0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
145b0 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
145c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
145d0 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
145e0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
145f0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
14600 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
14610 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
14620 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
14630 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14640 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14650 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
14660 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
14670 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
14680 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
14690 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
146a0 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c 6f 63 6b  ile );.  afpLock
146b0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
146c0 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
146d0 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
146e0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
146f0 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74  t;.  if( context
14700 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20  ->reserved ){.  
14710 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a    *pResOut = 1;.
14720 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14730 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
14740 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
14750 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
14760 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
14770 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
14780 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  */.  .  /* Check
14790 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
147a0 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
147b0 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
147c0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
147d0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
147e0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
147f0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
14800 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
14810 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
14820 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
14830 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a  s holds it..   *
14840 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
14850 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b  d ){.    /* lock
14860 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79   the RESERVED by
14870 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  te */.    int lr
14880 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
14890 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
148a0 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
148b0 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20  BYTE, 1,1);  .  
148c0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
148d0 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =lrc ){.      /*
148e0 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
148f0 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
14900 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
14910 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
14920 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
14930 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
14940 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66  /.      lrc = af
14950 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
14960 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
14970 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
14980 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73  1, 0);.    } els
14990 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
149a0 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  we failed to get
149b0 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73   the lock then s
149c0 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74  omeone else must
149d0 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20   have it */.    
149e0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
149f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
14a00 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
14a10 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63   ){.      rc=lrc
14a20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
14a30 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
14a40 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
14a50 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
14a60 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d %d (afp)\n", p
14a70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
14a80 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70  erved));.  .  *p
14a90 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
14aa0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
14ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
14ac0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
14ad0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
14ae0 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
14af0 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
14b00 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
14b10 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
14b20 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
14b30 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
14b40 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
14b50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
14b60 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
14b70 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
14b80 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
14b90 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
14ba0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
14bb0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
14bc0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
14bd0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
14be0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
14bf0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
14c00 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
14c10 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
14c20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
14c30 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
14c40 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
14c50 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
14c60 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
14c70 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
14c80 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
14c90 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
14ca0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
14cb0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
14cc0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
14cd0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
14ce0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
14cf0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
14d00 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
14d10 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
14d20 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
14d30 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
14d40 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
14d50 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
14d60 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
14d70 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
14d80 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
14d90 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
14da0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
14db0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
14dc0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
14dd0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
14de0 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65  t afpLock(sqlite
14df0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14e00 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  eFileLock){.  in
14e10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14e20 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
14e30 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14e40 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
14e50 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
14e60 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
14e70 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
14e80 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
14e90 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
14ea0 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
14eb0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61  gContext;.  .  a
14ec0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
14ed0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
14ee0 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
14ef0 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%s,%d) pid=%d (
14f00 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
14f10 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
14f20 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
14f30 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ck), azFileLock(
14f40 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14f50 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  ),.           az
14f60 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d  FileLock(pInode-
14f70 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e  >eFileLock), pIn
14f80 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67  ode->nShared , g
14f90 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a  etpid()));..  /*
14fa0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
14fb0 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
14fc0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
14fd0 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
14fe0 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
14ff0 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
15000 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
15010 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
15020 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
15030 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
15040 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
15050 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
15060 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
15070 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
15080 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
15090 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
150a0 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
150b0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
150c0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
150d0 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
150e0 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ck)));.    retur
150f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15100 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
15110 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
15120 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
15130 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
15140 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
15150 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
15160 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
15170 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
15180 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
15190 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
151a0 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
151b0 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
151c0 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
151d0 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
151e0 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
151f0 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
15200 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
15210 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
15220 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
15230 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
15240 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
15250 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
15260 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
15270 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
15280 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
15290 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
152a0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
152b0 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  .  .  /* This mu
152c0 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
152d0 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
152e0 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
152f0 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
15300 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
15310 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
15320 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
15330 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68  .  /* If some th
15340 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
15350 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76  PID has a lock v
15360 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75  ia a different u
15370 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61  nixFile*.  ** ha
15380 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75  ndle that preclu
15390 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65  des the requeste
153a0 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42  d lock, return B
153b0 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
153c0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
153d0 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  k!=pInode->eFile
153e0 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20  Lock && .       
153f0 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
15400 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
15410 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
15420 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20  ARED_LOCK)).    
15430 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
15440 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
15450 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
15460 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
15470 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  a SHARED lock is
15480 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20   requested, and 
15490 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
154a0 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61  g this PID alrea
154b0 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48  dy.  ** has a SH
154c0 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44  ARED or RESERVED
154d0 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72   lock, then incr
154e0 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
154f0 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20  counts and.  ** 
15500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15510 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
15520 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15530 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49  OCK && .     (pI
15540 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
15550 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
15560 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
15570 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
15580 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
15590 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
155a0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
155b0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
155c0 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
155d0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
155e0 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
155f0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15600 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
15610 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
15620 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
15630 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
15640 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
15650 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20  lock;.  }.    . 
15660 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
15670 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
15680 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
15690 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
156a0 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
156b0 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
156c0 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
156d0 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
156e0 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
156f0 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
15700 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
15710 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15720 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
15730 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
15740 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
15750 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
15760 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
15770 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a      int failed;.
15780 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
15790 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
157a0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
157b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
157c0 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69   1);.    if (fai
157d0 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20  led) {.      rc 
157e0 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  = failed;.      
157f0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
15800 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  k;.    }.  }.  .
15810 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
15820 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
15830 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
15840 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
15850 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
15860 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
15870 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
15880 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
15890 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
158a0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
158b0 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c   int lrc1, lrc2,
158c0 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20   lrc1Errno;.    
158d0 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20  long lk, mask;. 
158e0 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20     .    assert( 
158f0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
15900 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
15910 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
15920 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock==0 );.      
15930 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73    .    mask = (s
15940 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20  izeof(long)==8) 
15950 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  ? LARGEST_INT64 
15960 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  : 0x7fffffff;.  
15970 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
15980 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45   read-lock SHARE
15990 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a  D_LOCK */.    /*
159a0 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71   note that the q
159b0 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61  uality of the ra
159c0 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74  ndomness doesn't
159d0 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63   matter that muc
159e0 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61  h */.    lk = ra
159f0 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e  ndom(); .    pIn
15a00 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20  ode->sharedByte 
15a10 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53  = (lk & mask)%(S
15a20 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b  HARED_SIZE - 1);
15a30 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53  .    lrc1 = afpS
15a40 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15a50 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
15a60 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
15a70 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
15a80 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
15a90 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
15aa0 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
15ab0 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
15ac0 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
15ad0 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
15ae0 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
15af0 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
15b00 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
15b10 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
15b20 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15b30 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
15b40 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
15b50 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
15b60 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
15b70 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15b80 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
15b90 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
15ba0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15bb0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15bc0 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
15bd0 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
15be0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
15bf0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15c00 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15c10 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
15c20 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
15c30 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
15c40 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
15c50 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
15c60 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
15c70 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
15c80 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
15c90 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
15ca0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
15cb0 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
15cc0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
15cd0 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
15ce0 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
15cf0 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
15d00 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
15d10 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
15d20 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
15d30 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
15d40 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
15d50 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
15d60 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
15d70 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
15d80 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
15d90 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
15da0 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
15db0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
15dc0 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
15dd0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
15de0 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
15df0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
15e00 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
15e10 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
15e20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
15e30 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
15e40 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
15e50 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
15e60 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
15e70 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
15e80 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
15e90 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
15ea0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
15eb0 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
15ec0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
15ed0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
15ee0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
15ef0 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
15f00 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
15f10 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
15f20 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
15f30 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
15f40 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
15f50 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
15f60 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
15f70 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
15f80 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
15f90 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
15fa0 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
15fb0 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
15fc0 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
15fd0 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
15fe0 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
15ff0 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
16000 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
16010 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16020 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
16030 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
16040 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
16050 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
16060 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16070 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16080 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
16090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160a0 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
160b0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
160c0 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
160d0 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
160e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
160f0 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
16100 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
16110 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
16120 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
16130 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
16140 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16150 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
16160 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
16190 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
161a0 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
161b0 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
161c0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
161d0 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
16200 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
16210 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
16220 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
16230 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
16240 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
16250 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
16260 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
16270 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
16280 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
16290 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
162a0 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
162b0 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  d & SQLITE_IOERR
162c0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
162d0 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a  R) ? failed2 : .
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
162f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
16300 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
16310 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
16320 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
16330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
16340 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20  c = failed; .   
16350 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16360 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
16370 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
16380 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
16390 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
163a0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
163b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
163c0 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
163d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
163e0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
163f0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
16400 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
16410 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
16420 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
16430 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
16440 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
16450 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
16460 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
16470 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
16480 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
16490 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
164a0 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
164b0 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
164c0 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
164d0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
164e0 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
164f0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
16500 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16510 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
16520 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
16530 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
16540 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
16550 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
16560 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
16570 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
16580 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
16590 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
165a0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
165b0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
165c0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
165d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
165e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
165f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
16600 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
16610 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
16620 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16630 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
16640 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16650 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
16660 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
16670 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
16680 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
16690 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
166a0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
166b0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
166c0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
166d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
166e0 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64    int skipShared
166f0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
16700 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68  ITE_TEST.  int h
16710 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e   = pFile->h;.#en
16720 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
16730 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
16740 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
16750 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
16760 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
16770 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
16780 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
16790 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
167a0 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
167b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
167c0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
167d0 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
167e0 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
167f0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
16800 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
16810 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
16820 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
16830 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
16840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16850 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
16860 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
16870 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
16880 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
16890 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
168a0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
168b0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
168c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
168d0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
168e0 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
168f0 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
16900 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
16910 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
16920 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
16930 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
16940 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
16950 0a 20 20 20 20 0a 23 69 66 6e 64 65 66 20 4e 44  .    .#ifndef ND
16960 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
16970 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
16980 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
16990 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
169a0 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
169b0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
169c0 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
169d0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
169e0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
169f0 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
16a00 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
16a10 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
16a20 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
16a30 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
16a40 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
16a50 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
16a60 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
16a70 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
16a80 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
16a90 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
16aa0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
16ab0 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
16ac0 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
16ad0 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
16ae0 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
16af0 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
16b00 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
16b10 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
16b20 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
16b30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
16b40 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  ert( pFile->inNo
16b50 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20  rmalWrite==0.   
16b60 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
16b70 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
16b80 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
16b90 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
16ba0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  ==1 );.    pFile
16bb0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
16bc0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
16bd0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
16be0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
16bf0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
16c00 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
16c10 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16c20 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
16c30 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
16c40 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  SIZE, 0);.      
16c50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16c60 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
16c70 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
16c80 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
16c90 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
16ca0 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69   only re-establi
16cb0 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
16cc0 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
16cd0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  */.        int s
16ce0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
16cf0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
16d00 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ode->sharedByte;
16d10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
16d20 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16d30 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16d40 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
16d50 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20   1, 1);.      } 
16d60 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73  else {.        s
16d70 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  kipShared = 1;. 
16d80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16d90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16da0 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
16db0 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
16dc0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
16dd0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16de0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16df0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
16e00 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
16e10 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
16e20 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
16e30 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53  ->eFileLock>=RES
16e40 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f  ERVED_LOCK && co
16e50 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
16e60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
16e70 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16e80 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16e90 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
16ea0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
16eb0 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20   !rc ){ .       
16ec0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
16ed0 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d  ed = 0; .      }
16ee0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
16ef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16f00 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
16f10 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
16f20 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a  e->nShared>1)){.
16f30 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
16f40 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
16f50 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _LOCK;.    }.  }
16f60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16f70 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63  E_OK && eFileLoc
16f80 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20  k==NO_LOCK ){.. 
16f90 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
16fa0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
16fb0 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
16fc0 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
16fd0 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
16fe0 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
16ff0 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
17000 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
17010 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
17020 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
17030 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
17040 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
17050 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
17060 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
17070 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
17080 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17090 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
170a0 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
170b0 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  {.      Simulate
170c0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
170d0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
170e0 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
170f0 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
17100 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
17110 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69  ;.      if( !ski
17120 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20  pShared ){.     
17130 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
17140 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17150 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65  th, pFile, share
17160 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29  dLockByte, 1, 0)
17170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17180 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
17190 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
171a0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
171b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
171c0 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
171d0 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
171e0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
171f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17200 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
17210 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17220 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
17230 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
17240 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
17250 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50  {.        closeP
17260 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
17270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17280 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
17290 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
172a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
172b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
172c0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
172d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
172e0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
172f0 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
17300 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
17310 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61   context .*/.sta
17320 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65  tic int afpClose
17330 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17340 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
17350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
17360 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
17370 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
17380 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
17390 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
173a0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
173b0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
173c0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
173d0 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
173e0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
173f0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
17400 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
17410 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
17420 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
17430 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
17440 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
17450 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
17460 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
17470 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
17480 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
17490 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
174a0 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  ode->aPending.  
174b0 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
174c0 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
174d0 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  when.      ** th
174e0 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
174f0 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
17500 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e  .      setPendin
17510 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  gFd(pFile);.    
17520 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  }.    releaseIno
17530 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
17540 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17550 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
17560 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d  ntext);.    rc =
17570 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
17580 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  d);.    unixLeav
17590 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
175a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
175b0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
175c0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
175d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
175e0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
175f0 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
17600 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63  e is the AFP loc
17610 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
17620 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
17630 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
17640 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
17650 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
17660 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
17670 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
17680 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
17690 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63    If you don't c
176a0 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63  ompile for a mac
176b0 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78  , then the "unix
176c0 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20  -afp".** VFS is 
176d0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  not available..*
176e0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
176f0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
17700 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
17710 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
17720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17730 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
17740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17780 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
17790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
177e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
177f0 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67  egin NFS Locking
17800 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
17810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17820 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
17830 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
17840 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
17850 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a  ING_STYLE./*. **
17860 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
17870 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
17880 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
17890 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
178a0 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d   eFileLock. ** m
178b0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
178c0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
178d0 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66  LOCK.. **. ** If
178e0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
178f0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
17900 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
17910 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
17920 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  . ** the request
17930 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
17940 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
17950 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73  s a no-op.. */.s
17960 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c  tatic int nfsUnl
17970 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
17980 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
17990 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ock){.  return p
179a0 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
179b0 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a  FileLock, 1);.}.
179c0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
179d0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
179e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
179f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
17a00 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
17a10 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53 20  bove is the NFS 
17a20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
17a30 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
17a40 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
17a50 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
17a60 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
17a70 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
17a80 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
17a90 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
17aa0 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  le.  .**.*******
17ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
17ac0 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f  nd of the NFS lo
17ad0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
17ae0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
17af0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
17b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b40 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
17b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
17ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c  ********** Non-l
17bb0 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  ocking sqlite3_f
17bc0 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile methods ****
17bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
17bf0 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f  The next divisio
17c00 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65  n contains imple
17c10 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61  mentations for a
17c20 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  ll methods of th
17c30 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  e .** sqlite3_fi
17c40 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20  le object other 
17c50 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  than the locking
17c60 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c   methods.  The l
17c70 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64  ocking.** method
17c80 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 69  s were defined i
17c90 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76  n divisions abov
17ca0 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d  e (one locking m
17cb0 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76  ethod per.** div
17cc0 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d  ision).  Those m
17cd0 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20  ethods that are 
17ce0 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
17cf0 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61  cking modes.** a
17d00 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68  re gather togeth
17d10 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76  er into this div
17d20 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ision..*/../*.**
17d30 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
17d40 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68  set passed as th
17d50 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17d60 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  t, then read cnt
17d70 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20   .** bytes into 
17d80 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65  pBuf. Return the
17d90 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
17da0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a   actually read..
17db0 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f  **.** NB:  If yo
17dc0 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  u define USE_PRE
17dd0 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36  AD or USE_PREAD6
17de0 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  4, then it might
17df0 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65   also.** be nece
17e00 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20  ssary to define 
17e10 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f  _XOPEN_SOURCE to
17e20 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76   be 500.  This v
17e30 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e  aries from.** on
17e40 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74  e system to anot
17e50 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69  her.  Since SQLi
17e60 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69  te does not defi
17e70 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20  ne USE_PREAD.** 
17e80 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20  any any form by 
17e90 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c  default, we will
17ea0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
17eb0 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
17ec0 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63  URCE..** See tic
17ed0 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23  kets #2741 and #
17ee0 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  2681..**.** To a
17ef0 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
17f00 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
17f10 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74   a failed read t
17f20 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
17f30 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
17f40 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
17f50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
17f60 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
17f70 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
17f80 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69  nt64 offset, voi
17f90 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
17fa0 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69  ){.  int got;.#i
17fb0 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f  f (!defined(USE_
17fc0 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e  PREAD) && !defin
17fd0 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29  ed(USE_PREAD64))
17fe0 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74  .  i64 newOffset
17ff0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
18000 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69  _START;.#if defi
18010 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
18020 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65   do{ got = osPre
18030 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
18040 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77  cnt, offset); }w
18050 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
18060 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
18070 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18080 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
18090 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
180a0 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67  PREAD64).  do{ g
180b0 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69  ot = osPread64(i
180c0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
180d0 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65   offset); }while
180e0 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
180f0 3d 3d 45 49 4e 54 52 29 3b 0a 20 20 53 69 6d 75  ==EINTR);.  Simu
18100 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
18110 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20   = -1 );.#else. 
18120 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
18130 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
18140 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53  , SEEK_SET);.  S
18150 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18160 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20  newOffset-- );. 
18170 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
18180 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66  offset ){.    if
18190 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
181a0 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  1 ){.      ((uni
181b0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
181c0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
181d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
181e0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
181f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
18200 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ...    }.    ret
18210 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f  urn -1;.  }.  do
18220 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69  { got = osRead(i
18230 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
18240 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  ; }while( got<0 
18250 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
18260 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  );.#endif.  TIME
18270 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74  R_END;.  if( got
18280 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  <0 ){.    ((unix
18290 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
182a0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
182b0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  }.  OSTRACE(("RE
182c0 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25  AD    %-3d %5d %
182d0 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64  7lld %llu\n", id
182e0 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74  ->h, got, offset
182f0 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
18300 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b  );.  return got;
18310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
18320 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
18330 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
18340 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18350 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
18360 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
18370 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
18380 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
18390 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
183a0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
183b0 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71  t unixRead(.  sq
183c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
183d0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  .  void *pBuf, .
183e0 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
183f0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
18400 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t.){.  unixFile 
18410 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
18420 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67  le *)id;.  int g
18430 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  ot;.  assert( id
18440 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
18450 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
18460 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
18470 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
18480 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
18490 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
184a0 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
184b0 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
184c0 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
184d0 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
184e0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
184f0 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
18500 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
18510 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
18520 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
18530 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
18540 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
18550 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
18560 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
18570 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
18580 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
18590 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
185a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
185b0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
185c0 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
185d0 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
185e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
185f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
18600 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18610 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
18620 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
18630 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
18640 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
18650 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
18660 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
18670 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
18680 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
18690 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
186a0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
186b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
186c0 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
186d0 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
186e0 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
186f0 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
18700 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
18710 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
18720 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
18730 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
18740 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
18750 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  fset..**.** To a
18760 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
18770 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
18780 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20   a failed write 
18790 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
187a0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
187b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
187c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
187d0 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
187e0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
187f0 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
18800 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
18810 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20  .  int got;.#if 
18820 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
18830 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
18840 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
18850 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
18860 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
18870 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
18880 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64  d(USE_PREAD).  d
18890 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74  o{ got = osPwrit
188a0 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
188b0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68  nt, offset); }wh
188c0 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
188d0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
188e0 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
188f0 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67  PREAD64).  do{ g
18900 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28  ot = osPwrite64(
18910 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18920 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65  , offset);}while
18930 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
18940 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a  ==EINTR);.#else.
18950 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
18960 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
18970 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
18980 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18990 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
189a0 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
189b0 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69  =offset ){.    i
189c0 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20  f( newOffset == 
189d0 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e  -1 ){.      ((un
189e0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
189f0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
18a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18a10 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
18a20 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
18a30 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ....    }.    re
18a40 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64  turn -1;.  }.  d
18a50 6f 7b 20 67 6f 74 20 3d 20 6f 73 57 72 69 74 65  o{ got = osWrite
18a60 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18a70 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c  t); }while( got<
18a80 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
18a90 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  R );.#endif.  TI
18aa0 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67  MER_END;.  if( g
18ab0 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  ot<0 ){.    ((un
18ac0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
18ad0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
18ae0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
18af0 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35  "WRITE   %-3d %5
18b00 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
18b10 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66   id->h, got, off
18b20 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  set, TIMER_ELAPS
18b30 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  ED));.  return g
18b40 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  ot;.}.../*.** Wr
18b50 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
18b60 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
18b70 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
18b80 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
18b90 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
18ba0 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
18bb0 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
18bc0 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65  ic int unixWrite
18bd0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
18be0 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76   *id, .  const v
18bf0 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
18c00 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
18c10 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29  _int64 offset .)
18c20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
18c30 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
18c40 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65  )id;.  int wrote
18c50 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
18c60 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
18c70 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
18c80 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
18c90 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
18ca0 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
18cb0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
18cc0 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
18cd0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
18ce0 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
18cf0 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
18d00 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
18d10 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
18d20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d  pFile->pUnused==
18d30 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
18d40 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
18d50 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
18d60 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
18d70 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
18d80 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
18d90 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20  EBUG.  /* If we 
18da0 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
18db0 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
18dc0 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
18dd0 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20  opposed to.  ** 
18de0 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
18df0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
18e00 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
18e10 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
18e20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61  a.  ** normal da
18e30 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65  tabase file) the
18e40 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  n record the fac
18e50 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  t that the datab
18e60 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61  ase.  ** has cha
18e70 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
18e80 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
18e90 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72  r is modified, r
18ea0 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20  ecord that.  ** 
18eb0 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  fact too..  */. 
18ec0 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
18ed0 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20  rmalWrite ){.   
18ee0 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
18ef0 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61   = 1;  /* The da
18f00 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
18f10 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  modified */.    
18f20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26  if( offset<=24 &
18f30 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37  & offset+amt>=27
18f40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
18f50 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64  ;.      char old
18f60 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53  Cntr[4];.      S
18f70 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18f80 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72  nign(1);.      r
18f90 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  c = seekAndRead(
18fa0 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e  pFile, 24, oldCn
18fb0 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69  tr, 4);.      Si
18fc0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18fd0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
18fe0 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d  ( rc!=4 || memcm
18ff0 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68  p(oldCntr, &((ch
19000 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66  ar*)pBuf)[24-off
19010 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20  set], 4)!=0 ){. 
19020 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72         pFile->tr
19030 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
19040 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
19050 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73  tion counter has
19060 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20   changed */.    
19070 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
19080 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61  ndif..  while( a
19090 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d  mt>0 && (wrote =
190a0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
190b0 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
190c0 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20  f, amt))>0 ){.  
190d0 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
190e0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
190f0 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
19100 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
19110 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
19120 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
19130 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
19140 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
19150 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
19160 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
19170 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29  ;..  if( amt>0 )
19180 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c  {.    if( wrote<
19190 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74  0 && pFile->last
191a0 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b  Errno!=ENOSPC ){
191b0 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  .      /* lastEr
191c0 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
191d0 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  ndWrite */.     
191e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
191f0 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
19200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
19210 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
19220 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  0; /* not a syst
19230 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
19240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19250 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
19260 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19270 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
19280 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
19290 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
192a0 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
192b0 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
192c0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
192d0 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
192e0 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
192f0 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67  cs are occurring
19300 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
19310 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
19320 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
19330 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
19340 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
19350 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
19360 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73  * We do not trus
19370 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f  t systems to pro
19380 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66  vide a working f
19390 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d  datasync().  Som
193a0 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20  e do..** Others 
193b0 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61  do no.  To be sa
193c0 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63  fe, we will stic
193d0 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 6f 77  k with the (slow
193e0 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a 20  er) fsync()..** 
193f0 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74  If you know that
19400 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65   your system doe
19410 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61 73  s support fdatas
19420 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c  ync() correctly,
19430 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20  .** then simply 
19440 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66  compile with -Df
19450 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79  datasync=fdatasy
19460 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  nc.*/.#if !defin
19470 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26 26  ed(fdatasync) &&
19480 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75   !defined(__linu
19490 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 66 64  x__).# define fd
194a0 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65  atasync fsync.#e
194b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  ndif../*.** Defi
194c0 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
194d0 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65  C to 0 or 1 depe
194e0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
194f0 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46   or not.** the F
19500 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f  _FULLFSYNC macro
19510 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f   is defined.  F_
19520 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72  FULLFSYNC is cur
19530 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61  rently.** only a
19540 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20  vailable on Mac 
19550 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20  OS X.  But that 
19560 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f  could change..*/
19570 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53  .#ifdef F_FULLFS
19580 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56  YNC.# define HAV
19590 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65  E_FULLFSYNC 1.#e
195a0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56  lse.# define HAV
195b0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65  E_FULLFSYNC 0.#e
195c0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
195d0 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53 54 5f  ITE_USE_REQUEST_
195e0 46 55 4c 4c 46 53 59 4e 43 0a 23 69 6d 70 6f 72  FULLFSYNC.#impor
195f0 74 20 3c 6e 6f 74 69 66 79 2e 68 3e 0a 23 69 6d  t <notify.h>.#im
19600 70 6f 72 74 20 3c 6c 69 62 6b 65 72 6e 2f 4f 53  port <libkern/OS
19610 41 74 6f 6d 69 63 2e 68 3e 0a 73 74 61 74 69 63  Atomic.h>.static
19620 20 4f 53 53 70 69 6e 4c 6f 63 6b 20 6e 6f 74 69   OSSpinLock noti
19630 66 79 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 23 64 65  fy_lock = 0;.#de
19640 66 69 6e 65 20 52 45 51 55 45 53 54 5f 46 55 4c  fine REQUEST_FUL
19650 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54 49  LSYNC_NOTIFICATI
19660 4f 4e 20 20 20 20 22 63 6f 6d 2e 61 70 70 6c 65  ON    "com.apple
19670 2e 72 65 71 73 79 6e 63 22 0a 23 65 6e 64 69 66  .reqsync".#endif
19680 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
19690 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
196a0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
196b0 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
196c0 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
196d0 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
196e0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
196f0 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
19700 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
19710 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
19720 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
19730 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
19740 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
19750 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
19760 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
19770 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
19780 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
19790 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
197a0 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
197b0 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
197c0 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
197d0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
197e0 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
197f0 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
19800 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
19810 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
19820 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
19830 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
19840 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
19850 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
19860 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73  *.** SQLite sets
19870 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
19880 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f  ag if the size o
19890 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
198a0 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20  changed..** The 
198b0 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61  idea behind data
198c0 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20  Only is that it 
198d0 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74  should only writ
198e0 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65  e the file conte
198f0 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e  nt.** to disk, n
19900 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57  ot the inode.  W
19910 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f  e only set dataO
19920 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20  nly if the file 
19930 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68  size is .** unch
19940 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20  anged since the 
19950 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72  file size is par
19960 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20  t of the inode. 
19970 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65   However, .** Te
19980 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20  d Ts'o tells us 
19990 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
199a0 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65   will also write
199b0 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68   the inode if th
199c0 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68  e.** file size h
199d0 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65  as changed.  The
199e0 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65   only real diffe
199f0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64  rence between fd
19a00 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64  atasync().** and
19a10 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65   fsync(), Ted te
19a20 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20  lls us, is that 
19a30 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
19a40 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a   not flush the.*
19a50 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d  * inode if the m
19a60 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72  time or owner or
19a70 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74   other inode att
19a80 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61  ributes have cha
19a90 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79  nged..** We only
19aa0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
19ab0 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74  file size, not t
19ac0 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74  he other file at
19ad0 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20  tributes, so.** 
19ae0 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65  as far as SQLite
19af0 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61   is concerned, a
19b00 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73  n fdatasync() is
19b10 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65   always adequate
19b20 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61  ..** So, we alwa
19b30 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63  ys use fdatasync
19b40 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69  () if it is avai
19b50 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73  lable, regardles
19b60 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75  s of.** the valu
19b70 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c  e of the dataOnl
19b80 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69  y flag..*/.stati
19b90 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
19ba0 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
19bb0 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
19bc0 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
19bd0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
19be0 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f  ing "ifdef/elif/
19bf0 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73  else/" block has
19c00 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74   the same struct
19c10 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ure as.  ** the 
19c20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73  one below. It is
19c30 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65   replicated here
19c40 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64   solely to avoid
19c50 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a   cluttering .  *
19c60 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f  * up the real co
19c70 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53  de with the UNUS
19c80 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d  ED_PARAMETER() m
19c90 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  acros..  */.#ifd
19ca0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
19cb0 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
19cc0 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
19cd0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
19ce0 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
19cf0 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
19d00 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45  nly);.#elif HAVE
19d10 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55  _FULLFSYNC.  UNU
19d20 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
19d30 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20  taOnly);.#else. 
19d40 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19d50 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
19d60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
19d70 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69  dataOnly);.#endi
19d80 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  f..  /* Record t
19d90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
19da0 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20  es that we do a 
19db0 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61  normal fsync() a
19dc0 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e  nd .  ** FULLSYN
19dd0 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  C.  This is used
19de0 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
19df0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
19e00 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20  his procedure.  
19e10 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ** gets called w
19e20 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
19e30 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  arguments..  */.
19e40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
19e50 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  ST.  if( fullSyn
19e60 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  c ) sqlite3_full
19e70 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
19e80 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
19e90 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
19ea0 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
19eb0 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
19ec0 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
19ed0 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
19ee0 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
19ef0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19f00 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53  NO_SYNC.  rc = S
19f10 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20  QLITE_OK;.#elif 
19f20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
19f30 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
19f40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
19f50 53 45 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c 46  SE_REQUEST_FULLF
19f60 53 59 4e 43 0a 20 20 20 20 72 63 20 3d 20 6f 73  SYNC.    rc = os
19f70 46 73 79 6e 63 28 66 64 29 3b 0a 20 20 20 20 69  Fsync(fd);.    i
19f80 66 20 28 21 72 63 29 20 7b 0a 20 20 20 20 20 20  f (!rc) {.      
19f90 4f 53 53 70 69 6e 4c 6f 63 6b 4c 6f 63 6b 28 26  OSSpinLockLock(&
19fa0 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20  notify_lock);.  
19fb0 20 20 20 20 72 63 20 3d 20 6e 6f 74 69 66 79 5f      rc = notify_
19fc0 70 6f 73 74 28 52 45 51 55 45 53 54 5f 46 55 4c  post(REQUEST_FUL
19fd0 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54 49  LSYNC_NOTIFICATI
19fe0 4f 4e 29 3b 0a 20 20 20 20 20 20 4f 53 53 70 69  ON);.      OSSpi
19ff0 6e 4c 6f 63 6b 55 6e 6c 6f 63 6b 28 26 6e 6f 74  nLockUnlock(&not
1a000 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d  ify_lock);.    }
1a010 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
1a020 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55  osFcntl(fd, F_FU
1a030 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 23 65 6e  LLFSYNC, 0);.#en
1a040 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
1a050 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f   rc = 1;.  }.  /
1a060 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59  * If the FULLFSY
1a070 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20  NC failed, fall 
1a080 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69  back to attempti
1a090 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20  ng an fsync().. 
1a0a0 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74   ** It shouldn't
1a0b0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   be possible for
1a0c0 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61   fullfsync to fa
1a0d0 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  il on the local 
1a0e0 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65  .  ** file syste
1a0f0 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66  m (on OSX), so f
1a100 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73  ailure indicates
1a110 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a   that FULLFSYNC.
1a120 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f    ** isn't suppo
1a130 72 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69  rted for this fi
1a140 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61  le system. So, a
1a150 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20  ttempt an fsync 
1a160 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e  .  ** and (for n
1a170 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f  ow) ignore the o
1a180 76 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70  verhead of a sup
1a190 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63  erfluous fcntl c
1a1a0 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64  all.  .  ** It'd
1a1b0 20 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65   be better to de
1a1c0 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73  tect fullfsync s
1a1d0 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20  upport once and 
1a1e0 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20  avoid .  ** the 
1a1f0 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79  fcntl call every
1a200 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61   time sync is ca
1a210 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lled..  */.  if(
1a220 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63   rc ) rc = fsync
1a230 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66  (fd);..#elif def
1a240 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1a250 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29    /* fdatasync()
1a260 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74   on HFS+ doesn't
1a270 20 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66   yet flush the f
1a280 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63  ile size if it c
1a290 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79  hanged correctly
1a2a0 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74  .  ** so current
1a2b0 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f  ly we default to
1a2c0 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20   the macro that 
1a2d0 72 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73  redefines fdatas
1a2e0 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a  ync to fsync.  *
1a2f0 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66  /.  rc = fsync(f
1a300 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20  d);.#else .  rc 
1a310 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b  = fdatasync(fd);
1a320 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1a330 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20    if( rc==-1 && 
1a340 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29  errno==ENOTSUP )
1a350 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63  {.    rc = fsync
1a360 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (fd);.  }.#endif
1a370 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
1a380 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  /.#endif /* ifde
1a390 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1a3a0 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46   elif HAVE_FULLF
1a3b0 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f  SYNC */..  if( O
1a3c0 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21  S_VXWORKS && rc!
1a3d0 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  = -1 ){.    rc =
1a3e0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1a3f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
1a400 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
1a410 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
1a420 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
1a430 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
1a440 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79  *.** If dataOnly
1a450 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68  ==0 then both th
1a460 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e  e file itself an
1a470 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28  d its metadata (
1a480 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63  file.** size, ac
1a490 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20  cess time, etc) 
1a4a0 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20  are synced.  If 
1a4b0 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e  dataOnly!=0 then
1a4c0 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c   only the.** fil
1a4d0 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  e data is synced
1a4e0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
1a4f0 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
1a500 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
1a510 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1a520 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
1a530 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
1a540 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
1a550 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
1a560 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
1a570 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
1a580 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
1a590 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
1a5a0 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
1a5b0 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
1a5c0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1a5d0 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
1a5e0 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
1a5f0 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
1a600 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
1a610 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
1a620 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
1a630 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
1a640 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
1a650 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1a660 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
1a670 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
1a680 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
1a690 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
1a6a0 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
1a6b0 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
1a6c0 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
1a6d0 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
1a6e0 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71   int unixSync(sq
1a6f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1a700 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
1a710 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65  t rc;.  unixFile
1a720 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1a730 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20  ile*)id;..  int 
1a740 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c  isDataOnly = (fl
1a750 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ags&SQLITE_SYNC_
1a760 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  DATAONLY);.  int
1a770 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66   isFullsync = (f
1a780 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1a790 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20  TE_SYNC_FULL;.. 
1a7a0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f   /* Check that o
1a7b0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e  ne of SQLITE_SYN
1a7c0 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c  C_NORMAL or FULL
1a7d0 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20   was passed */. 
1a7e0 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30   assert((flags&0
1a7f0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1a800 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c  C_NORMAL.      |
1a810 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  | (flags&0x0F)==
1a820 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1a830 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  .  );..  /* Unix
1a840 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
1a850 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
1a860 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1a870 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
1a880 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
1a890 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
1a8a0 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
1a8b0 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
1a8c0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1a8d0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
1a8e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1a8f0 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  L );..  assert( 
1a900 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
1a910 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE(("SYNC    %-3
1a920 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
1a930 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73  ;.  rc = full_fs
1a940 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73  ync(pFile->h, is
1a950 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61  Fullsync, isData
1a960 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Only);.  Simulat
1a970 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1a980 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1a990 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1a9a0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1a9b0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1a9c0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1a9d0 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73  _FSYNC, "full_fs
1a9e0 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
1a9f0 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  th);.  }.  if( p
1aa00 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
1aa10 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
1aa20 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68 61  DIRSYNC %-3d (ha
1aa30 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20  ve_fullfsync=%d 
1aa40 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c  fullsync=%d)\n",
1aa50 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20   pFile->dirfd,. 
1aa60 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f             HAVE_
1aa70 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c  FULLFSYNC, isFul
1aa80 6c 73 79 6e 63 29 29 3b 0a 23 69 66 6e 64 65 66  lsync));.#ifndef
1aa90 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
1aaa0 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54  DIRSYNC.    /* T
1aab0 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  he directory syn
1aac0 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  c is only attemp
1aad0 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e  ted if full_fsyn
1aae0 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e  c is.    ** turn
1aaf0 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69  ed off or unavai
1ab00 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c  lable.  If a ful
1ab10 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64  l_fsync occurred
1ab20 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74   above,.    ** t
1ab30 68 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  hen the director
1ab40 79 20 73 79 6e 63 20 69 73 20 73 75 70 65 72 66  y sync is superf
1ab50 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  luous..    */.  
1ab60 20 20 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c    if( (!HAVE_FUL
1ab70 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46 75 6c  LFSYNC || !isFul
1ab80 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66  lsync) && full_f
1ab90 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66  sync(pFile->dirf
1aba0 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  d,0,0) ){.      
1abb0 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65   /*.       ** We
1abc0 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 6d   have received m
1abd0 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20  ultiple reports 
1abe0 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74 75 72  of fsync() retur
1abf0 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65  ning.       ** e
1ac00 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69  rrors when appli
1ac10 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65  ed to directorie
1ac20 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c  s on certain fil
1ac30 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  e systems..     
1ac40 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69    ** A failed di
1ac50 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
1ac60 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20  not a big deal. 
1ac70 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20   So it seems.   
1ac80 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f      ** better to
1ac90 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f   ignore the erro
1aca0 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35 37  r.  Ticket #1657
1acb0 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
1acc0 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c 61 73 74    /* pFile->last
1acd0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 2a  Errno = errno; *
1ace0 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75  /.       /* retu
1acf0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
1ad00 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   */.    }.#endif
1ad10 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  .    /* Only nee
1ad20 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20  d to sync once, 
1ad30 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 20 64 69  so close the  di
1ad40 72 65 63 74 6f 72 79 20 77 68 65 6e 20 77 65 20  rectory when we 
1ad50 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20 20 20 20  are done */.    
1ad60 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
1ad70 6c 65 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  le, pFile->dirfd
1ad80 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
1ad90 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20   pFile->dirfd = 
1ada0 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
1adb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
1adc0 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
1add0 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
1ade0 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
1adf0 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
1ae00 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
1ae10 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
1ae20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1ae30 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
1ae40 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  )id;.  int rc;. 
1ae50 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
1ae60 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1ae70 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1ae80 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1ae90 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
1aea0 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69  e user has confi
1aeb0 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69  gured a chunk-si
1aec0 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ze for this file
1aed0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1aee0 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74   ** file so that
1aef0 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
1af00 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
1af10 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65  r of chunks (i.e
1af20 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  . the.  ** actua
1af30 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65  l file size afte
1af40 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  r the operation 
1af50 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68  may be larger th
1af60 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
1af70 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a  .  ** size)..  *
1af80 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
1af90 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 6e 42  zChunk ){.    nB
1afa0 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
1afb0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
1afc0 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
1afd0 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1afe0 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  hunk;.  }..  rc 
1aff0 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  = robust_ftrunca
1b000 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66  te(pFile->h, (of
1b010 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66  f_t)nByte);.  if
1b020 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
1b030 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1b040 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1b050 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1b060 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1b070 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1b080 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1b090 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65  .  }else{.#ifnde
1b0a0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  f NDEBUG.    /* 
1b0b0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1b0c0 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
1b0d0 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
1b0e0 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
1b0f0 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  .    ** doing a 
1b100 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1b110 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1b120 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1b130 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a  er than a.    **
1b140 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
1b150 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72   file) and we tr
1b160 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
1b170 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a  to zero length,.
1b180 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65      ** that effe
1b190 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20  ctively updates 
1b1a0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1b1b0 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
1b1c0 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68  happen.    ** wh
1b1d0 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64  en restoring a d
1b1e0 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
1b1f0 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f  e backup API fro
1b200 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a  m a zero-length.
1b210 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20      ** source.. 
1b220 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46     */.    if( pF
1b230 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1b240 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29  te && nByte==0 )
1b250 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74  {.      pFile->t
1b260 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1b270 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1b280 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b290 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
1b2a0 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
1b2b0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1b2c0 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
1b2d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1b2e0 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  nixFileSize(sqli
1b2f0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
1b300 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
1b310 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74   rc;.  struct st
1b320 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74  at buf;.  assert
1b330 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f  ( id );.  rc = o
1b340 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c  sFstat(((unixFil
1b350 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29  e*)id)->h, &buf)
1b360 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1b370 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1b380 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1b390 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1b3a0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1b3b0 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
1b3c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1b3d0 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1b3e0 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1b3f0 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1b400 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1b410 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1b420 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
1b430 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1b440 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1b450 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1b460 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1b470 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1b480 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1b490 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1b4a0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1b4b0 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1b4c0 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1b4d0 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1b4e0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1b4f0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1b500 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1b510 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1b520 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1b530 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1b540 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1b550 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1b560 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1b570 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1b580 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1b590 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1b5a0 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1b5b0 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1b5c0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1b5d0 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1b5e0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1b5f0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1b600 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1b610 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1b620 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1b630 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1b640 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1b650 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1b660 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1b670 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1b680 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1b690 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1b6a0 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
1b6b0 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1b6c0 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1b6d0 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1b6e0 66 69 6c 65 2c 20 69 74 20 63 6f 75 6c 64 20 62  file, it could b
1b6f0 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69  e.** that the fi
1b700 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 65  le needs to be e
1b710 78 74 65 6e 64 65 64 20 61 74 20 74 68 69 73 20  xtended at this 
1b720 70 6f 69 6e 74 2e 20 4f 74 68 65 72 77 69 73 65  point. Otherwise
1b730 2c 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  , the.** SQLITE_
1b740 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
1b750 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 6e  operation is a n
1b760 6f 2d 6f 70 20 66 6f 72 20 55 6e 69 78 2e 0a 2a  o-op for Unix..*
1b770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e  /.static int fcn
1b780 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46  tlSizeHint(unixF
1b790 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20  ile *pFile, i64 
1b7a0 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46  nByte){.  if( pF
1b7b0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a  ile->szChunk ){.
1b7c0 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20      i64 nSize;  
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69    /* Required fi
1b7f0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
1b800 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20  truct stat buf; 
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b820 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74  Used to hold ret
1b830 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73  urn values of fs
1b840 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20  tat() */.   .   
1b850 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69   if( osFstat(pFi
1b860 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20 72  le->h, &buf) ) r
1b870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1b880 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20 6e  RR_FSTAT;..    n
1b890 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70  Size = ((nByte+p
1b8a0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29  File->szChunk-1)
1b8b0 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   / pFile->szChun
1b8c0 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
1b8d0 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  unk;.    if( nSi
1b8e0 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73  ze>(i64)buf.st_s
1b8f0 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69  ize ){..#if defi
1b900 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
1b910 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
1b920 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
1b930 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  E.      /* The c
1b940 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e  ode below is han
1b950 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e  dling the return
1b960 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c   value of osFall
1b970 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a  ocate() .      *
1b980 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73  * correctly. pos
1b990 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69  ix_fallocate() i
1b9a0 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65  s defined to "re
1b9b0 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75  turns zero on su
1b9c0 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a  ccess, .      **
1b9d0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d   or an error num
1b9e0 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22  ber on  failure"
1b9f0 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67  . See the manpag
1ba00 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  e for details. *
1ba10 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b  /.      int err;
1ba20 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
1ba30 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f     err = osFallo
1ba40 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62  cate(pFile->h, b
1ba50 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a  uf.st_size, nSiz
1ba60 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a  e-buf.st_size);.
1ba70 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72        }while( er
1ba80 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  r==EINTR );.    
1ba90 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74 75    if( err ) retu
1baa0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1bab0 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20  WRITE;.#else.   
1bac0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20     /* If the OS 
1bad0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f  does not have po
1bae0 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c  six_fallocate(),
1baf0 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74 20   fake it. First 
1bb00 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74 72  use.      ** ftr
1bb10 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74 20  uncate() to set 
1bb20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 74  the file size, t
1bb30 68 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e 67  hen write a sing
1bb40 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20 20  le byte to.     
1bb50 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79 74   ** the last byt
1bb60 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20  e in each block 
1bb70 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e  within the exten
1bb80 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69 73  ded region. This
1bb90 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65  .      ** is the
1bba0 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65 20   same technique 
1bbb0 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 74 6f  used by glibc to
1bbc0 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69 78   implement posix
1bbd0 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20 20  _fallocate().   
1bbe0 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d 73     ** on systems
1bbf0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76   that do not hav
1bc00 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61  e a real falloca
1bc10 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  te() system call
1bc20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1bc30 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
1bc40 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
1bc50 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
1bc60 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
1bc70 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1bc90 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
1bca0 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20  ite to */..     
1bcb0 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
1bcc0 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1bcd0 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  nSize) ){.      
1bce0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1bcf0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1bd00 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1bd10 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1bd20 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1bd30 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1bd40 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
1bd50 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65 20   }.      iWrite 
1bd60 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20  = ((buf.st_size 
1bd70 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42  + 2*nBlk - 1)/nB
1bd80 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20  lk)*nBlk-1;.    
1bd90 20 20 77 68 69 6c 65 28 20 69 57 72 69 74 65 3c    while( iWrite<
1bda0 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  nSize ){.       
1bdb0 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73 65   int nWrite = se
1bdc0 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1bdd0 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29  , iWrite, "", 1)
1bde0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57  ;.        if( nW
1bdf0 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e  rite!=1 ) return
1be00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1be10 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57 72  ITE;.        iWr
1be20 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20  ite += nBlk;.   
1be30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1be40 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1be50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1be60 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  f (SQLITE_ENABLE
1be70 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26  _APPLE_SPI>0) &&
1be80 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1be90 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  __).#include "sq
1bea0 6c 69 74 65 33 5f 70 72 69 76 61 74 65 2e 68 22  lite3_private.h"
1beb0 0a 23 69 6e 63 6c 75 64 65 20 3c 63 6f 70 79 66  .#include <copyf
1bec0 69 6c 65 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e  ile.h>.static in
1bed0 74 20 67 65 74 44 62 50 61 74 68 46 6f 72 55 6e  t getDbPathForUn
1bee0 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
1bef0 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62  *pFile, char *db
1bf00 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  Path);.#endif../
1bf10 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  *.** Information
1bf20 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20   and control of 
1bf30 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  an open file han
1bf40 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
1bf50 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72  nt unixFileContr
1bf60 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
1bf70 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
1bf80 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74  d *pArg){.  swit
1bf90 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1bfa0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1bfb0 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
1bfc0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1bfd0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1bfe0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  ->eFileLock;.   
1bff0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c000 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1c010 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  ase SQLITE_LAST_
1c020 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
1c030 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75  (int*)pArg = ((u
1c040 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
1c050 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
1c060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c070 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c080 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
1c090 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
1c0a0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1c0b0 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e  ->szChunk = *(in
1c0c0 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  t *)pArg;.      
1c0d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c0e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c0f0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1c100 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20  ZE_HINT: {.     
1c110 20 72 65 74 75 72 6e 20 66 63 6e 74 6c 53 69 7a   return fcntlSiz
1c120 65 48 69 6e 74 28 28 75 6e 69 78 46 69 6c 65 20  eHint((unixFile 
1c130 2a 29 69 64 2c 20 2a 28 69 36 34 20 2a 29 70 41  *)id, *(i64 *)pA
1c140 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  rg);.    }.    c
1c150 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1c160 5f 52 45 41 44 4f 4e 4c 59 5f 53 48 4d 3a 20 7b  _READONLY_SHM: {
1c170 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
1c180 65 2a 29 69 64 29 2d 3e 72 65 61 64 4f 6e 6c 79  e*)id)->readOnly
1c190 53 68 6d 20 3d 20 28 70 41 72 67 21 3d 30 29 3b  Shm = (pArg!=0);
1c1a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1c1b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1c1c0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1c1d0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
1c1e0 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64  alls this method
1c1f0 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20   to signal that 
1c200 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20  it has done.    
1c210 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ** a rollback an
1c220 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
1c230 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65  ase is therefore
1c240 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20   unchanged and. 
1c250 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69     ** it hence i
1c260 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1c270 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e  transaction chan
1c280 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65  ge counter to be
1c290 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65  .    ** unchange
1c2a0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
1c2b0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1c2c0 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a  DB_UNCHANGED: {.
1c2d0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
1c2e0 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20  *)id)->dbUpdate 
1c2f0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1c300 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1c310 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   }.#endif.#if SQ
1c320 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1c330 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1c340 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1c350 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c360 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
1c370 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E:.    case SQLI
1c380 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
1c390 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65  FILE: {.      re
1c3a0 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f  turn proxyFileCo
1c3b0 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67  ntrol(id,op,pArg
1c3c0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
1c3d0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
1c3e0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1c3f0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1c400 45 5f 5f 29 20 2a 2f 0a 23 69 66 20 28 53 51 4c  E__) */.#if (SQL
1c410 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
1c420 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
1c430 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1c440 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
1c450 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 3a  UNCATE_DATABASE:
1c460 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c   {.      unixFil
1c470 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1c480 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20  File*)id;.      
1c490 69 6e 74 20 74 72 63 20 3d 20 53 51 4c 49 54 45  int trc = SQLITE
1c4a0 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 65  _OK;.      int e
1c4b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 46 69 6c 65  FileLock = pFile
1c4c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  ->eFileLock;.   
1c4d0 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
1c4e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 63 68 61  TE_OK;.      cha
1c4f0 72 20 6a 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  r jPath[MAXPATHL
1c500 45 4e 2b 39 5d 3b 0a 20 20 20 20 20 20 73 69 7a  EN+9];.      siz
1c510 65 5f 74 20 6a 4c 65 6e 3b 0a 20 20 20 20 20 20  e_t jLen;.      
1c520 0a 20 20 20 20 20 20 69 66 28 20 65 46 69 6c 65  .      if( eFile
1c530 4c 6f 63 6b 3c 53 51 4c 49 54 45 5f 4c 4f 43 4b  Lock<SQLITE_LOCK
1c540 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20  _SHARED ){.     
1c550 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70     rc = pFile->p
1c560 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64  Method->xLock(id
1c570 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48  , SQLITE_LOCK_SH
1c580 41 52 45 44 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ARED);.      }. 
1c590 20 20 20 20 20 69 66 28 20 21 72 63 20 26 26 20       if( !rc && 
1c5a0 65 46 69 6c 65 4c 6f 63 6b 3c 53 51 4c 49 54 45  eFileLock<SQLITE
1c5b0 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 20  _LOCK_EXCLUSIVE 
1c5c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c5d0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
1c5e0 78 4c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45  xLock(id, SQLITE
1c5f0 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 29  _LOCK_EXCLUSIVE)
1c600 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c610 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1c620 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
1c630 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f  leLock > eFileLo
1c640 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
1c650 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
1c660 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
1c670 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20  eLock);.        
1c680 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
1c690 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1c6a0 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70     rc = pFile->p
1c6b0 4d 65 74 68 6f 64 2d 3e 78 54 72 75 6e 63 61 74  Method->xTruncat
1c6c0 65 28 69 64 2c 20 28 28 70 46 69 6c 65 2d 3e 66  e(id, ((pFile->f
1c6d0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
1c6e0 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
1c6f0 29 20 21 3d 20 30 29 20 3f 20 31 4c 20 3a 20 30  ) != 0) ? 1L : 0
1c700 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  L);.      if( !r
1c710 63 20 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b 3d  c && (SQLITE_OK=
1c720 3d 67 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69  =getDbPathForUni
1c730 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 6a 50 61  xFile(pFile, jPa
1c740 74 68 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  th)) ){.        
1c750 6a 4c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6a  jLen = strlcat(j
1c760 50 61 74 68 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Path, "-journal"
1c770 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 39 29 3b  , MAXPATHLEN+9);
1c780 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 4c 65  .        if( jLe
1c790 6e 20 3c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 39  n < MAXPATHLEN+9
1c7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1c7b0 74 20 6a 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61  t jfd = open(jPa
1c7c0 74 68 2c 20 4f 5f 54 52 55 4e 43 29 3b 0a 20 20  th, O_TRUNC);.  
1c7d0 20 20 20 20 20 20 20 20 69 66 28 20 28 6a 66 64          if( (jfd
1c7e0 20 3d 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20 20   == -1) ){.     
1c7f0 20 20 20 20 20 20 20 69 66 20 28 20 65 72 72 6e         if ( errn
1c800 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20  o!=ENOENT ){.   
1c810 20 20 20 20 20 20 20 20 20 20 20 70 65 72 72 6f             perro
1c820 72 28 6a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  r(jPath);.      
1c830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c840 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1c850 20 20 20 20 20 20 20 66 73 79 6e 63 28 6a 66 64         fsync(jfd
1c860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  );.            c
1c870 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20 20 20 20  lose(jfd);.     
1c880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1c890 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c8a0 20 20 20 20 20 20 74 72 63 3d 72 63 3b 0a 20 20        trc=rc;.  
1c8b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c8c0 21 74 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !trc ){.        
1c8d0 74 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  trc = pFile->pMe
1c8e0 74 68 6f 64 2d 3e 78 53 79 6e 63 28 69 64 2c 20  thod->xSync(id, 
1c8f0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1c900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c910 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
1c920 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63  eLock > eFileLoc
1c930 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  k ){.        int
1c940 20 75 6e 6c 6f 63 6b 52 43 20 3d 20 70 46 69 6c   unlockRC = pFil
1c950 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
1c960 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c  ock(id, SQLITE_L
1c970 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 20  OCK_SHARED);.   
1c980 20 20 20 20 20 69 66 20 28 21 72 63 29 20 72 63       if (!rc) rc
1c990 20 3d 20 75 6e 6c 6f 63 6b 52 43 3b 0a 20 20 20   = unlockRC;.   
1c9a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1c9b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
1c9c0 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  > eFileLock ){. 
1c9d0 20 20 20 20 20 20 20 69 6e 74 20 75 6e 6c 6f 63         int unloc
1c9e0 6b 52 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  kRC = pFile->pMe
1c9f0 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64  thod->xUnlock(id
1ca00 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f  , SQLITE_LOCK_NO
1ca10 4e 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  NE);.        if 
1ca20 28 21 72 63 29 20 72 63 20 3d 20 75 6e 6c 6f 63  (!rc) rc = unloc
1ca30 6b 52 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  kRC;.      }.   
1ca40 20 20 20 69 66 28 20 74 72 63 20 29 7b 0a 20 20     if( trc ){.  
1ca50 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 63        return trc
1ca60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ca70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ca80 0a 20 20 20 20 20 20 0a 20 20 20 20 63 61 73 65  .      .    case
1ca90 20 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 5f   SQLITE_REPLACE_
1caa0 44 41 54 41 42 41 53 45 3a 20 7b 0a 20 20 20 20  DATABASE: {.    
1cab0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1cac0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1cad0 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 72 63  d;.      int trc
1cae0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1caf0 20 20 20 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63      int eFileLoc
1cb00 6b 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  k = pFile->eFile
1cb10 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20  Lock;.      int 
1cb20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cb30 20 20 20 20 20 20 63 68 61 72 20 6a 50 61 74 68        char jPath
1cb40 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 39 5d 3b 0a  [MAXPATHLEN+9];.
1cb50 20 20 20 20 20 20 73 69 7a 65 5f 74 20 6a 4c 65        size_t jLe
1cb60 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
1cb70 20 2a 73 72 63 64 62 20 3d 20 28 73 71 6c 69 74   *srcdb = (sqlit
1cb80 65 33 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  e3 *)pArg;.     
1cb90 20 42 74 72 65 65 20 2a 70 53 72 63 42 74 72 65   Btree *pSrcBtre
1cba0 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  e = NULL;.      
1cbb0 69 6e 74 20 65 53 72 63 46 69 6c 65 4c 6f 63 6b  int eSrcFileLock
1cbc0 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e   = SQLITE_LOCK_N
1cbd0 4f 4e 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  ONE;.      int s
1cbe0 72 63 4c 6f 63 6b 52 43 20 3d 20 2d 31 3b 0a 20  rcLockRC = -1;. 
1cbf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
1cc00 65 20 2a 73 72 63 5f 66 69 6c 65 20 3d 20 4e 55  e *src_file = NU
1cc10 4c 4c 3b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  LL;.      unixFi
1cc20 6c 65 20 2a 70 53 72 63 46 69 6c 65 20 3d 20 4e  le *pSrcFile = N
1cc30 55 4c 4c 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  ULL;.      .    
1cc40 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1cc50 66 65 74 79 43 68 65 63 6b 4f 6b 28 73 72 63 64  fetyCheckOk(srcd
1cc60 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  b) ){.        re
1cc70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1cc80 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SE;.      }.    
1cc90 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3c    if( eFileLock<
1cca0 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52  SQLITE_LOCK_SHAR
1ccb0 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ED ){.        rc
1ccc0 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f   = pFile->pMetho
1ccd0 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53 51 4c  d->xLock(id, SQL
1cce0 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29  ITE_LOCK_SHARED)
1ccf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cd00 69 66 28 20 21 72 63 20 26 26 20 65 46 69 6c 65  if( !rc && eFile
1cd10 4c 6f 63 6b 3c 53 51 4c 49 54 45 5f 4c 4f 43 4b  Lock<SQLITE_LOCK
1cd20 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
1cd30 20 20 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65        rc = pFile
1cd40 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
1cd50 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
1cd60 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 20  _EXCLUSIVE);.   
1cd70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
1cd80 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rc ){.        /*
1cd90 20 67 65 74 20 74 68 65 20 73 72 63 20 66 69 6c   get the src fil
1cda0 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 64 68  e descriptor adh
1cdb0 65 72 69 6e 67 20 74 6f 20 74 68 65 20 64 62 20  ering to the db 
1cdc0 73 74 72 75 63 74 20 61 63 63 65 73 73 20 72 75  struct access ru
1cdd0 6c 65 73 20 0a 20 20 20 20 20 20 20 20 20 2a 2a  les .         **
1cde0 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d 6f   this code is mo
1cdf0 64 65 6c 65 64 20 61 66 74 65 72 20 73 71 6c 69  deled after sqli
1ce00 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
1ce10 28 29 20 69 6e 20 6d 61 69 6e 2e 63 0a 20 20 20  () in main.c.   
1ce20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
1ce30 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ce40 65 6e 74 65 72 28 73 72 63 64 62 2d 3e 6d 75 74  enter(srcdb->mut
1ce50 65 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ex);.        if(
1ce60 20 73 72 63 64 62 2d 3e 6e 44 62 3e 30 20 29 7b   srcdb->nDb>0 ){
1ce70 0a 20 20 20 20 20 20 20 20 20 20 70 53 72 63 42  .          pSrcB
1ce80 74 72 65 65 20 3d 20 73 72 63 64 62 2d 3e 61 44  tree = srcdb->aD
1ce90 62 5b 30 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[0].pBt;.      
1cea0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1ceb0 70 53 72 63 42 74 72 65 65 20 29 7b 0a 20 20 20  pSrcBtree ){.   
1cec0 20 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 53         Pager *pS
1ced0 72 63 50 61 67 65 72 3b 0a 20 20 20 20 20 20 20  rcPager;.       
1cee0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1cef0 6e 74 65 72 28 70 53 72 63 42 74 72 65 65 29 3b  nter(pSrcBtree);
1cf00 0a 20 20 20 20 20 20 20 20 20 20 70 53 72 63 50  .          pSrcP
1cf10 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
1cf20 72 65 65 50 61 67 65 72 28 70 53 72 63 42 74 72  reePager(pSrcBtr
1cf30 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ee);.          a
1cf40 73 73 65 72 74 28 20 70 53 72 63 50 61 67 65 72  ssert( pSrcPager
1cf50 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1cf60 20 73 72 63 5f 66 69 6c 65 20 3d 20 73 71 6c 69   src_file = sqli
1cf70 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 53 72  te3PagerFile(pSr
1cf80 63 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  cPager);.       
1cf90 20 20 20 61 73 73 65 72 74 28 20 73 72 63 5f 66     assert( src_f
1cfa0 69 6c 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ile!=0 );.      
1cfb0 20 20 20 20 69 66 28 20 73 72 63 5f 66 69 6c 65      if( src_file
1cfc0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
1cfd0 20 20 20 20 20 20 20 20 20 20 70 53 72 63 46 69            pSrcFi
1cfe0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
1cff0 29 73 72 63 5f 66 69 6c 65 3b 0a 20 20 20 20 20  )src_file;.     
1d000 20 20 20 20 20 20 20 65 53 72 63 46 69 6c 65 4c         eSrcFileL
1d010 6f 63 6b 20 3d 20 70 53 72 63 46 69 6c 65 2d 3e  ock = pSrcFile->
1d020 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  eFileLock;.     
1d030 20 20 20 20 20 20 20 69 66 28 20 65 53 72 63 46         if( eSrcF
1d040 69 6c 65 4c 6f 63 6b 3c 53 51 4c 49 54 45 5f 4c  ileLock<SQLITE_L
1d050 4f 43 4b 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  OCK_SHARED ){.  
1d060 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d070 20 70 53 72 63 46 69 6c 65 2d 3e 70 4d 65 74 68   pSrcFile->pMeth
1d080 6f 64 2d 3e 78 4c 6f 63 6b 28 73 72 63 5f 66 69  od->xLock(src_fi
1d090 6c 65 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  le, SQLITE_LOCK_
1d0a0 53 48 41 52 45 44 29 3b 0a 20 20 20 20 20 20 20  SHARED);.       
1d0b0 20 20 20 20 20 20 20 73 72 63 4c 6f 63 6b 52 43         srcLockRC
1d0c0 20 3d 20 72 63 3b 20 2f 2a 20 53 51 4c 49 54 45   = rc; /* SQLITE
1d0d0 5f 4f 4b 20 6d 65 61 6e 73 20 77 65 20 6e 65 65  _OK means we nee
1d0e0 64 20 74 6f 20 75 6e 6c 6f 63 6b 20 6c 61 74 65  d to unlock late
1d0f0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  r */.           
1d100 20 7d 20 65 6c 73 65 20 69 66 28 20 65 53 72 63   } else if( eSrc
1d110 46 69 6c 65 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45  FileLock==SQLITE
1d120 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 20  _LOCK_EXCLUSIVE 
1d130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1d140 20 2f 2a 20 69 66 20 74 68 65 20 73 72 63 20 64   /* if the src d
1d150 61 74 61 62 61 73 65 20 68 61 73 20 61 6e 20 65  atabase has an e
1d160 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 76  xclusive lock, v
1d170 65 72 69 66 79 20 74 68 61 74 20 74 68 65 0a 20  erify that the. 
1d180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1d190 20 69 74 20 64 6f 65 73 6e 27 74 20 68 61 76 65   it doesn't have
1d1a0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
1d1b0 77 69 74 68 20 6f 70 65 6e 20 74 72 61 6e 73 61  with open transa
1d1c0 63 74 69 6f 6e 73 20 0a 20 20 20 20 20 20 20 20  ctions .        
1d1d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d1e0 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 44          if( getD
1d1f0 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
1d200 28 70 53 72 63 46 69 6c 65 2c 20 6a 50 61 74 68  (pSrcFile, jPath
1d210 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1d220 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d230 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20  _INTERNAL;.     
1d240 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d260 6a 4c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6a  jLen = strlcat(j
1d270 50 61 74 68 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Path, "-journal"
1d280 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 39 29 3b  , MAXPATHLEN+9);
1d290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d2a0 20 69 66 28 20 6a 4c 65 6e 20 3c 20 4d 41 58 50   if( jLen < MAXP
1d2b0 41 54 48 4c 45 4e 2b 39 20 29 7b 0a 20 20 20 20  ATHLEN+9 ){.    
1d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1d2d0 74 20 6a 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61  t jfd = open(jPa
1d2e0 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  th, O_RDONLY);. 
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d300 20 69 66 28 20 6a 66 64 3d 3d 2d 31 20 29 7b 0a   if( jfd==-1 ){.
1d310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d320 20 20 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45      if( errno!=E
1d330 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  NOENT ){.       
1d340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d350 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1d360 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
1d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1d380 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1d390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d3a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d3b0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1d3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d3d0 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 6a       /* if the j
1d3e0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 65 6e  ournal exists en
1d3f0 73 75 72 65 20 74 68 65 72 65 27 73 20 6e 6f 20  sure there's no 
1d400 70 65 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 20  pending .       
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1d420 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 79 20   transaction by 
1d430 63 68 65 63 6b 69 6e 67 20 74 68 65 20 6a 6f 75  checking the jou
1d440 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
1d450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d460 20 20 20 63 68 61 72 20 6d 61 67 69 63 5b 38 5d     char magic[8]
1d470 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d480 20 20 20 20 20 20 73 73 69 7a 65 5f 74 20 72 6c        ssize_t rl
1d490 65 6e 20 3d 20 70 72 65 61 64 28 6a 66 64 2c 20  en = pread(jfd, 
1d4a0 6d 61 67 69 63 2c 20 38 2c 20 30 29 3b 0a 20 20  magic, 8, 0);.  
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4c0 20 20 69 66 28 20 72 6c 65 6e 3c 30 20 29 7b 0a    if( rlen<0 ){.
1d4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1d4f0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d510 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d520 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
1d540 73 65 20 69 66 28 20 72 6c 65 6e 3d 3d 38 20 29  se if( rlen==8 )
1d550 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d560 20 20 20 20 20 20 20 20 63 68 61 72 20 74 65 73          char tes
1d570 74 5b 38 5d 20 3d 20 7b 27 5c 30 27 2c 27 5c 30  t[8] = {'\0','\0
1d580 27 2c 27 5c 30 27 2c 27 5c 30 27 2c 27 5c 30 27  ','\0','\0','\0'
1d590 2c 27 5c 30 27 2c 27 5c 30 27 2c 27 5c 30 27 7d  ,'\0','\0','\0'}
1d5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d5b0 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63          if( memc
1d5c0 6d 70 28 6d 61 67 69 63 2c 74 65 73 74 2c 38 29  mp(magic,test,8)
1d5d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d5e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d5f0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d620 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1d630 65 20 69 66 28 20 72 6c 65 6e 21 3d 30 20 29 7b  e if( rlen!=0 ){
1d640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d650 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1d660 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20  TE_INTERNAL;.   
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1d690 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6a 66 64         close(jfd
1d6a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1d6b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d6c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d6d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d6e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d6f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d700 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d710 4d 49 53 55 53 45 3b 0a 20 20 20 20 20 20 20 20  MISUSE;.        
1d720 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1d730 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1d740 20 20 20 20 69 66 28 20 73 72 63 4c 6f 63 6b 52      if( srcLockR
1d750 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  C==SQLITE_OK ){.
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
1d770 72 63 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  rcFile->pMethod-
1d780 3e 78 55 6e 6c 6f 63 6b 28 73 72 63 5f 66 69 6c  >xUnlock(src_fil
1d790 65 2c 20 65 53 72 63 46 69 6c 65 4c 6f 63 6b 29  e, eSrcFileLock)
1d7a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d7c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 53  te3BtreeLeave(pS
1d7d0 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20  rcBtree);.      
1d7e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1d7f0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 72 63          if( pSrc
1d800 46 69 6c 65 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 70  File==NULL || (p
1d810 53 72 63 46 69 6c 65 2d 3e 68 3c 30 29 20 29 7b  SrcFile->h<0) ){
1d820 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d830 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b  SQLITE_INTERNAL;
1d840 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1d850 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
1d860 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  rcdb->mutex);.  
1d870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d880 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1d890 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 72 6f 6c          /* unrol
1d8a0 6c 20 73 74 61 74 65 20 63 68 61 6e 67 65 73 20  l state changes 
1d8b0 61 6e 64 20 72 65 74 75 72 6e 20 65 72 72 6f 72  and return error
1d8c0 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20   code */.       
1d8d0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
1d8e0 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63  eLock > eFileLoc
1d8f0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  k ){.          p
1d900 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
1d910 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
1d920 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  Lock);.        }
1d930 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d940 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rc;.      }else{
1d950 0a 20 20 20 20 20 20 20 20 2f 2a 20 62 6f 74 68  .        /* both
1d960 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6c   databases are l
1d970 6f 63 6b 65 64 20 61 70 70 72 6f 70 72 69 61 74  ocked appropriat
1d980 65 6c 79 2c 20 63 6f 70 79 20 66 69 6c 65 20 64  ely, copy file d
1d990 61 74 61 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  ata.         ** 
1d9a0 61 6e 64 20 74 68 65 6e 20 75 6e 72 6f 6c 6c 20  and then unroll 
1d9b0 74 68 65 20 6c 6f 63 6b 73 20 77 65 20 61 64 64  the locks we add
1d9c0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 2a 2f  ed. .         */
1d9d0 0a 20 20 20 20 20 20 20 20 63 6f 70 79 66 69 6c  .        copyfil
1d9e0 65 5f 73 74 61 74 65 5f 74 20 73 3b 0a 20 20 20  e_state_t s;.   
1d9f0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 73 20       .        s 
1da00 3d 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65  = copyfile_state
1da10 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  _alloc();.      
1da20 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28    if( fcopyfile(
1da30 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 70 46 69  pSrcFile->h, pFi
1da40 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49  le->h, s, COPYFI
1da50 4c 45 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  LE_ALL) ){.     
1da60 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72 6e       switch(errn
1da70 6f 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  o) {.           
1da80 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20   case ENOMEM:.  
1da90 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1daa0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1dac0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1dad0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
1dae0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1daf0 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20  TE_INTERNAL;.   
1db00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1db10 20 7d 0a 20 20 20 20 20 20 20 20 63 6f 70 79 66   }.        copyf
1db20 69 6c 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73  ile_state_free(s
1db30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1db40 72 63 4c 6f 63 6b 52 43 3d 3d 53 51 4c 49 54 45  rcLockRC==SQLITE
1db50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1db60 20 70 53 72 63 46 69 6c 65 2d 3e 70 4d 65 74 68   pSrcFile->pMeth
1db70 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 73 72 63 5f  od->xUnlock(src_
1db80 66 69 6c 65 2c 20 65 53 72 63 46 69 6c 65 4c 6f  file, eSrcFileLo
1db90 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ck);.        }. 
1dba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
1dbb0 72 65 65 4c 65 61 76 65 28 70 53 72 63 42 74 72  reeLeave(pSrcBtr
1dbc0 65 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ee);.        sql
1dbd0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1dbe0 28 73 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  (srcdb->mutex);.
1dbf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
1dc00 20 20 20 20 20 69 66 28 20 21 72 63 20 26 26 20       if( !rc && 
1dc10 28 53 51 4c 49 54 45 5f 4f 4b 3d 3d 67 65 74 44  (SQLITE_OK==getD
1dc20 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
1dc30 28 70 46 69 6c 65 2c 20 6a 50 61 74 68 29 29 20  (pFile, jPath)) 
1dc40 29 7b 0a 20 20 20 20 20 20 20 20 6a 4c 65 6e 20  ){.        jLen 
1dc50 3d 20 73 74 72 6c 63 61 74 28 6a 50 61 74 68 2c  = strlcat(jPath,
1dc60 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 4d 41 58   "-journal", MAX
1dc70 50 41 54 48 4c 45 4e 2b 39 29 3b 0a 20 20 20 20  PATHLEN+9);.    
1dc80 20 20 20 20 69 66 28 20 6a 4c 65 6e 20 3c 20 4d      if( jLen < M
1dc90 41 58 50 41 54 48 4c 45 4e 2b 39 20 29 7b 0a 20  AXPATHLEN+9 ){. 
1dca0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 66 64           int jfd
1dcb0 20 3d 20 6f 70 65 6e 28 6a 50 61 74 68 2c 20 4f   = open(jPath, O
1dcc0 5f 54 52 55 4e 43 29 3b 0a 20 20 20 20 20 20 20  _TRUNC);.       
1dcd0 20 20 20 69 66 28 20 28 6a 66 64 20 3d 3d 20 2d     if( (jfd == -
1dce0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
1dcf0 20 20 69 66 20 28 20 65 72 72 6e 6f 21 3d 45 4e    if ( errno!=EN
1dd00 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  OENT ){.        
1dd10 20 20 20 20 20 20 70 65 72 72 6f 72 28 6a 50 61        perror(jPa
1dd20 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  th);.           
1dd30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65   }.          } e
1dd40 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
1dd50 20 20 66 73 79 6e 63 28 6a 66 64 29 3b 0a 20 20    fsync(jfd);.  
1dd60 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28            close(
1dd70 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
1dd80 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1dd90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dda0 20 74 72 63 3d 72 63 3b 0a 20 20 20 20 20 20 7d   trc=rc;.      }
1ddb0 0a 20 20 20 20 20 20 69 66 28 20 21 74 72 63 20  .      if( !trc 
1ddc0 29 7b 0a 20 20 20 20 20 20 20 20 74 72 63 20 3d  ){.        trc =
1ddd0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d   pFile->pMethod-
1dde0 3e 78 53 79 6e 63 28 69 64 2c 20 53 51 4c 49 54  >xSync(id, SQLIT
1ddf0 45 5f 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a 20 20  E_SYNC_FULL);.  
1de00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1de10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1de20 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a   > eFileLock ){.
1de30 20 20 20 20 20 20 20 20 69 6e 74 20 75 6e 6c 6f          int unlo
1de40 63 6b 52 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d  ckRC = pFile->pM
1de50 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69  ethod->xUnlock(i
1de60 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53  d, SQLITE_LOCK_S
1de70 48 41 52 45 44 29 3b 0a 20 20 20 20 20 20 20 20  HARED);.        
1de80 69 66 20 28 21 72 63 29 20 72 63 20 3d 20 75 6e  if (!rc) rc = un
1de90 6c 6f 63 6b 52 43 3b 0a 20 20 20 20 20 20 7d 0a  lockRC;.      }.
1dea0 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
1deb0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69  >eFileLock > eFi
1dec0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  leLock ){.      
1ded0 20 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 43 20 3d    int unlockRC =
1dee0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d   pFile->pMethod-
1def0 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 53 51 4c  >xUnlock(id, SQL
1df00 49 54 45 5f 4c 4f 43 4b 5f 4e 4f 4e 45 29 3b 0a  ITE_LOCK_NONE);.
1df10 20 20 20 20 20 20 20 20 69 66 20 28 21 72 63 29          if (!rc)
1df20 20 72 63 20 3d 20 75 6e 6c 6f 63 6b 52 43 3b 0a   rc = unlockRC;.
1df30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1df40 28 20 74 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( trc ){.       
1df50 20 72 65 74 75 72 6e 20 74 72 63 3b 0a 20 20 20   return trc;.   
1df60 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1df70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n rc;.    }.#end
1df80 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e  if /* (SQLITE_EN
1df90 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30  ABLE_APPLE_SPI>0
1dfa0 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  ) && defined(__A
1dfb0 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 20 20 63  PPLE__) */.    c
1dfc0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1dfd0 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b  _SYNC_OMITTED: {
1dfe0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1dff0 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e  LITE_OK;  /* A n
1e000 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  o-op */.    }.  
1e010 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1e020 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
1e030 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1e040 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
1e050 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
1e060 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
1e070 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
1e080 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
1e090 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
1e0a0 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
1e0b0 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
1e0c0 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
1e0d0 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
1e0e0 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
1e0f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
1e100 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
1e110 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
1e120 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
1e130 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
1e140 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
1e150 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
1e160 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
1e170 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
1e180 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
1e190 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
1e1a0 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
1e1b0 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
1e1c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
1e1d0 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
1e1e0 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b  _file *NotUsed){
1e1f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1e200 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
1e210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45  return SQLITE_DE
1e220 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
1e230 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E;.}../*.** Retu
1e240 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68  rn the device ch
1e250 61 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f  aracteristics fo
1e260 72 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73  r the file. This
1e270 20 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72   is always 0 for
1e280 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63   unix..*/.static
1e290 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43   int unixDeviceC
1e2a0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
1e2b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
1e2c0 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
1e2d0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
1e2e0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  d);.  return 0;.
1e2f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1e300 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a  E_OMIT_WAL.../*.
1e310 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74  ** Object used t
1e320 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73  o represent an s
1e330 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66  hared memory buf
1e340 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  fer.  .**.** Whe
1e350 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
1e360 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
1e370 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e   the same wal-in
1e380 64 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64  dex, each thread
1e390 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20  .** has its own 
1e3a0 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20  unixShm object, 
1e3b0 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69  but they all poi
1e3c0 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
1e3d0 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68  nstance.** of th
1e3e0 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
1e3f0 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
1e400 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c   words, each wal
1e410 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64  -index is opened
1e420 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65  .** only once pe
1e430 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  r process..**.**
1e440 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64   Each unixShmNod
1e450 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e  e object is conn
1e460 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c  ected to a singl
1e470 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
1e480 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f  object..** We co
1e490 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69  uld coalesce thi
1e4a0 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e  s object into un
1e4b0 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74  ixInodeInfo, but
1e4c0 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e   that would mean
1e4d0 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66  .** every open f
1e4e0 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ile that does no
1e4f0 74 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d  t use shared mem
1e500 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f  ory (in other wo
1e510 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65  rds, most.** ope
1e520 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68  n files) would h
1e530 61 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f  ave to carry aro
1e540 75 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69  und this extra i
1e550 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a  nformation.  So.
1e560 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ** the unixInode
1e570 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74  Info object cont
1e580 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
1e590 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f  o this unixShmNo
1e5a0 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64  de object.** and
1e5b0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1e5c0 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
1e5d0 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65  ed only when nee
1e5e0 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d  ded..**.** unixM
1e5f0 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
1e600 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
1e610 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
1e620 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
1e630 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
1e640 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
1e650 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1e660 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
1e670 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  nRef.**.** The f
1e680 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
1e690 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66  are read-only af
1e6a0 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ter the object i
1e6b0 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a  s created:.** .*
1e6c0 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20  *      fid.**   
1e6d0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a     zFilename.**.
1e6e0 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68  ** Either unixSh
1e6f0 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74  mNode.mutex must
1e700 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78   be held or unix
1e710 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20  ShmNode.nRef==0 
1e720 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  and.** unixMutex
1e730 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77  Held() is true w
1e740 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77  hen reading or w
1e750 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  riting any other
1e760 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69   field.** in thi
1e770 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  s structure..*/.
1e780 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f  struct unixShmNo
1e790 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  de {.  unixInode
1e7a0 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
1e7b0 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e    /* unixInodeIn
1e7c0 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69  fo that owns thi
1e7d0 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20  s SHM node */.  
1e7e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
1e7f0 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
1e800 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
1e810 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
1e820 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
1e830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1e840 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64  e of the mmapped
1e850 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68   file */.  int h
1e860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e870 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
1e880 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
1e890 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e8b0 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
1e8c0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
1e8d0 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b  /.  int nRegion;
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e8f0 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
1e900 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 63 68  apRegion */.  ch
1e910 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20  ar **apRegion;  
1e920 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
1e930 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72  y of mapped shar
1e940 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1e950 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  s */.  int nRef;
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e970 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
1e980 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
1e990 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
1e9a0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46  */.  unixShm *pF
1e9b0 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
1e9c0 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f  /* All unixShm o
1e9d0 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
1e9e0 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 38 20  to this */.  u8 
1e9f0 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
1ea00 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ea10 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
1ea20 64 2d 6f 6e 6c 79 20 6d 61 70 70 69 6e 67 20 2a  d-only mapping *
1ea30 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1ea40 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d  DEBUG.  u8 exclM
1ea50 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1ea60 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
1ea70 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
1ea80 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65  ld */.  u8 share
1ea90 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1eaa0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
1eab0 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
1eac0 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  */.  u8 nextShmI
1ead0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1eae0 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
1eaf0 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c  e unixShm.id val
1eb00 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
1eb10 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
1eb20 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
1eb30 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20   by this VFS to 
1eb40 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65  record the state
1eb50 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73   of an.** open s
1eb60 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e  hared memory con
1eb70 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  nection..**.** T
1eb80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1eb90 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  lds are initiali
1eba0 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62  zed when this ob
1ebb0 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
1ebc0 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d  and.** are read-
1ebd0 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a  only thereafter:
1ebe0 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68  .**.**    unixSh
1ebf0 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e  m.pFile.**    un
1ec00 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41  ixShm.id.**.** A
1ec10 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  ll other fields 
1ec20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20  are read/write. 
1ec30 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69   The unixShm.pFi
1ec40 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  le->mutex must b
1ec50 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
1ec60 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
1ec70 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
1ec80 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53  .*/.struct unixS
1ec90 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  hm {.  unixShmNo
1eca0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
1ecb0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1ecc0 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ing unixShmNode 
1ecd0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78  object */.  unix
1ece0 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  Shm *pNext;     
1ecf0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75         /* Next u
1ed00 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68 65 20  nixShm with the 
1ed10 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65  same unixShmNode
1ed20 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65   */.  u8 hasMute
1ed30 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1ed40 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64   /* True if hold
1ed50 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  ing the unixShmN
1ed60 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75  ode mutex */.  u
1ed70 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  16 sharedMask;  
1ed80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1ed90 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
1eda0 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20  s held */.  u16 
1edb0 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
1edc0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1edd0 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
1ede0 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66  s held */.#ifdef
1edf0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1ee00 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
1ee10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
1ee20 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
1ee30 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75  ion within its u
1ee40 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65  nixShmNode */.#e
1ee50 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.};../*.** C
1ee60 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f  onstants used fo
1ee70 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65  r locking.*/.#de
1ee80 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41  fine UNIX_SHM_BA
1ee90 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
1eea0 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
1eeb0 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
1eec0 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
1eed0 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  fine UNIX_SHM_DM
1eee0 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42  S    (UNIX_SHM_B
1eef0 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
1ef00 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
1ef10 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
1ef20 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61  ** Apply posix a
1ef30 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
1ef40 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d  r all bytes from
1ef50 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66   ofst through of
1ef60 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f  st+n-1..**.** Lo
1ef70 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65  cks block if the
1ef80 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79   mask is exactly
1ef90 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20   UNIX_SHM_C and 
1efa0 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67  are non-blocking
1efb0 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
1efc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1efd0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  xShmSystemLock(.
1efe0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
1eff0 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c  ShmNode, /* Appl
1f000 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
1f010 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
1f020 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
1f030 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
1f040 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43         /* F_UNLC
1f050 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46  K, F_RDLCK, or F
1f060 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
1f070 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
1f080 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
1f090 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
1f0a0 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  range */.  int n
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1f0d0 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
1f0e0 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
1f0f0 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  k f;       /* Th
1f100 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  e posix advisory
1f110 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
1f120 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  re */.  int rc =
1f130 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
1f140 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
1f150 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20  m fcntl() */..  
1f160 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
1f170 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1f180 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
1f190 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
1f1a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1f1b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1f1c0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1f1d0 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
1f1e0 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  ef==0 );..  /* S
1f1f0 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65  hared locks neve
1f200 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e  r span more than
1f210 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61   one byte */.  a
1f220 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c  ssert( n==1 || l
1f230 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b  ockType!=F_RDLCK
1f240 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20   );..  /* Locks 
1f250 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
1f260 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   */.  assert( n>
1f270 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53  =1 && n<SQLITE_S
1f280 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  HM_NLOCK );..  i
1f290 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
1f2a0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  0 ){.    /* Init
1f2b0 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
1f2c0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
1f2d0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  .    memset(&f, 
1f2e0 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20  0, sizeof(f));. 
1f2f0 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f     f.l_type = lo
1f300 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f  ckType;.    f.l_
1f310 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
1f320 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74  T;.    f.l_start
1f330 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c   = ofst;.    f.l
1f340 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72  _len = n;..    r
1f350 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d  c = osFcntl(pShm
1f360 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  Node->h, F_SETLK
1f370 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  , &f);.    rc = 
1f380 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c  (rc!=(-1)) ? SQL
1f390 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
1f3a0 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BUSY;.  }..  /* 
1f3b0 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61  Update the globa
1f3c0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64  l lock state and
1f3d0 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e   do debug tracin
1f3e0 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  g */.#ifdef SQLI
1f3f0 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36  TE_DEBUG.  { u16
1f400 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45   mask;.  OSTRACE
1f410 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b  (("SHM-LOCK "));
1f420 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f  .  mask = (1<<(o
1f430 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
1f440 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  st);.  if( rc==S
1f450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f460 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
1f470 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
1f480 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
1f490 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
1f4a0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1f4b0 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
1f4c0 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
1f4d0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
1f4e0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73   ~mask;.    }els
1f4f0 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
1f500 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
1f510 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
1f520 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
1f530 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
1f540 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
1f550 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
1f560 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
1f570 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
1f580 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1f590 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
1f5a0 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
1f5b0 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
1f5c0 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
1f5d0 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
1f5e0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d  ode->exclMask |=
1f5f0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68   mask;.      pSh
1f600 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
1f610 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1f620 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
1f630 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
1f640 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
1f650 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
1f660 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
1f670 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1f680 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
1f690 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
1f6a0 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
1f6b0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d  failed"));.    }
1f6c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1f6d0 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
1f6e0 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
1f6f0 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
1f700 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
1f710 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ofst));.    }.  
1f720 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d  }.  OSTRACE((" -
1f730 20 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78   afterwards %03x
1f740 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
1f750 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
1f760 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e  haredMask, pShmN
1f770 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b  ode->exclMask));
1f780 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
1f790 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20  eturn rc;       
1f7a0 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67   .}.../*.** Purg
1f7b0 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  e the unixShmNod
1f7c0 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c  eList list of al
1f7d0 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75  l entries with u
1f7e0 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  nixShmNode.nRef=
1f7f0 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
1f800 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
1f810 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
1f820 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
1f830 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
1f840 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
1f850 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
1f860 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1f870 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75  d unixShmPurge(u
1f880 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20  nixFile *pFd){. 
1f890 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20   unixShmNode *p 
1f8a0 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  = pFd->pInode->p
1f8b0 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72  ShmNode;.  asser
1f8c0 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
1f8d0 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  () );.  if( p &&
1f8e0 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
1f8f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73     int i;.    as
1f900 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d  sert( p->pInode=
1f910 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  =pFd->pInode );.
1f920 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78      if( p->mutex
1f930 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   ) sqlite3_mutex
1f940 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
1f950 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1f960 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
1f970 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  {.      if( p->h
1f980 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  >=0 ){.        m
1f990 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f  unmap(p->apRegio
1f9a0 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f  n[i], p->szRegio
1f9b0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1f9c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f9d0 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
1f9e0 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
1f9f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1fa00 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
1fa10 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68  n);.    if( p->h
1fa20 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62  >=0 ){.      rob
1fa30 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70  ust_close(pFd, p
1fa40 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
1fa50 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b        p->h = -1;
1fa60 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49  .    }.    p->pI
1fa70 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
1fa80 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
1fa90 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
1faa0 73 74 61 74 69 63 20 69 6e 74 20 69 73 50 72 6f  static int isPro
1fab0 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 75 6e  xyLockingMode(un
1fac0 69 78 46 69 6c 65 20 2a 29 3b 0a 73 74 61 74 69  ixFile *);.stati
1fad0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72  c const char *pr
1fae0 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f 72 79 42  oxySharedMemoryB
1faf0 61 73 65 50 61 74 68 28 75 6e 69 78 46 69 6c 65  asePath(unixFile
1fb00 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   *);../*.** Open
1fb10 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
1fb20 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64   area associated
1fb30 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62   with open datab
1fb40 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20  ase file pDbFd. 
1fb50 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63   .** This partic
1fb60 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ular implementat
1fb70 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64  ion uses mmapped
1fb80 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   files..**.** Th
1fb90 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69  e file used to i
1fba0 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d  mplement shared-
1fbb0 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65  memory is in the
1fbc0 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a   same directory.
1fbd0 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64  ** as the open d
1fbe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1fbf0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
1fc00 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64  me as the open d
1fc10 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
1fc20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20  with the "-shm" 
1fc30 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20 46  suffix added.  F
1fc40 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1fc50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fc60 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73  .** is "/home/us
1fc70 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74  er1/config.db" t
1fc80 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61  hen the file tha
1fc90 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
1fca0 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20   mmapped.** for 
1fcb0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69  shared memory wi
1fcc0 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68  ll be called "/h
1fcd0 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67  ome/user1/config
1fce0 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a  .db-shm".  .**.*
1fcf0 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61  * Another approa
1fd00 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20  ch to is to use 
1fd10 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68  files in /dev/sh
1fd20 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72  m or /dev/tmp or
1fd30 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65   an.** some othe
1fd40 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42  r tmpfs mount. B
1fd50 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20  ut if a file in 
1fd60 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72 65  a different dire
1fd70 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68  ctory.** from th
1fd80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fd90 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69  is used, then di
1fda0 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20 70  ffering access p
1fdb0 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72  ermissions.** or
1fdc0 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68   a chroot() migh
1fdd0 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66 66  t cause two diff
1fde0 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20  erent processes 
1fdf0 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64  on the same.** d
1fe00 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75  atabase to end u
1fe10 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e  p using differen
1fe20 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72  t files for shar
1fe30 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20  ed memory - .** 
1fe40 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65  meaning that the
1fe50 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20  ir memory would 
1fe60 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68  not really be sh
1fe70 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67  ared - resulting
1fe80 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20  .** in database 
1fe90 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76  corruption.  Nev
1fea0 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20  ertheless, this 
1feb0 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67 65  tmpfs file usage
1fec0 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c  .** can be enabl
1fed0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1fee0 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1fef0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d  E_SHM_DIRECTORY=
1ff00 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72  "/dev/shm".** or
1ff10 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   the equivalent.
1ff20 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68 65    The use of the
1ff30 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
1ff40 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69  CTORY compile-ti
1ff50 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73  me.** option res
1ff60 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  ults in an incom
1ff70 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66  patible build of
1ff80 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73   SQLite;  builds
1ff90 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68   of SQLite.** th
1ffa0 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69 6e  at with differin
1ffb0 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  g SQLITE_SHM_DIR
1ffc0 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20  ECTORY settings 
1ffd0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74  attempt to use t
1ffe0 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62  he.** same datab
1fff0 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
20000 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62  same time, datab
20010 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ase corruption w
20020 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
20030 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45  sult. The SQLITE
20040 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63  _SHM_DIRECTORY c
20050 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
20060 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  on is considered
20070 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64  .** "unsupported
20080 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61  " and may go awa
20090 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53 51  y in a future SQ
200a0 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a  Lite release..**
200b0 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67  .** When opening
200c0 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65   a new shared-me
200d0 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f  mory file, if no
200e0 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73   other instances
200f0 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65   of that.** file
20100 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   are currently o
20110 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f  pen, in this pro
20120 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72  cess or in other
20130 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e   processes, then
20140 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73  .** the file mus
20150 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  t be truncated t
20160 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72  o zero length or
20170 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72   have its header
20180 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   cleared..**.** 
20190 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
201a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 70  database file (p
201b0 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20 74  DbFd) is using t
201c0 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56  he "unix-excl" V
201d0 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73  FS.** that means
201e0 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69   that an exclusi
201f0 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  ve lock is held 
20200 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20210 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74  file and.** that
20220 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
20230 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20  ses are able to 
20240 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
20250 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a  e database.  In.
20260 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77 65  ** that case, we
20270 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e   do not really n
20280 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  eed shared memor
20290 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65  y.  No shared me
202a0 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20  mory.** file is 
202b0 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73 68  created.  The sh
202c0 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  ared memory will
202d0 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69   be simulated wi
202e0 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a  th heap memory..
202f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
20300 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  ixOpenSharedMemo
20310 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  ry(unixFile *pDb
20320 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  Fd){.  struct un
20330 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20  ixShm *p = 0;   
20340 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
20350 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
20360 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
20370 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70  t unixShmNode *p
20380 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68  ShmNode;   /* Th
20390 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61  e underlying mma
203a0 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
203b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
203c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
203d0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
203e0 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
203f0 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
20400 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20     /* The inode 
20410 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  of fd */.  char 
20420 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20  *zShmFilename;  
20430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
20440 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75  me of the file u
20450 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20  sed for SHM */. 
20460 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d   int nShmFilenam
20470 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
20480 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
20490 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  SHM filename in 
204a0 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41  bytes */..  /* A
204b0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
204c0 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68  r the new unixSh
204d0 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70  m object. */.  p
204e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
204f0 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  c( sizeof(*p) );
20500 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
20510 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
20520 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  M;.  memset(p, 0
20530 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
20540 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
20550 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  pShm==0 );..  /*
20560 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
20570 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f   a unixShmNode o
20580 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78  bject already ex
20590 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65  ists. Reuse an e
205a0 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65  xisting.  ** one
205b0 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65   if present. Cre
205c0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
205d0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
205e0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
205f0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
20600 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
20610 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f   pShmNode = pIno
20620 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
20630 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
20640 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
20650 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
20660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74            /* fst
20670 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61  at() info for da
20680 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
20690 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61      /* Call fsta
206a0 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75  t() to figure ou
206b0 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  t the permission
206c0 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  s on the databas
206d0 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a  e file. If.    *
206e0 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69  * a new *-shm fi
206f0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61  le is created, a
20700 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62  n attempt will b
20710 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65  e made to create
20720 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20   it.    ** with 
20730 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
20740 69 6f 6e 73 2e 20 54 68 65 20 61 63 74 75 61 6c  ions. The actual
20750 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74 68 65   permissions the
20760 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
20770 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 72 65  .    ** with are
20780 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
20790 63 75 72 72 65 6e 74 20 75 6d 61 73 6b 20 73 65  current umask se
207a0 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  tting..    */.  
207b0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44    if( osFstat(pD
207c0 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20  bFd->h, &sStat) 
207d0 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  && pInode->bProc
207e0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
207f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20800 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
20810 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
20820 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
20830 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61   const char *zBa
20840 73 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e  sePath = pDbFd->
20850 7a 50 61 74 68 3b 0a 23 69 66 20 64 65 66 69 6e  zPath;.#if defin
20860 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
20870 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
20880 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
20890 20 2f 2a 20 49 66 20 70 44 62 46 64 20 69 73 20   /* If pDbFd is 
208a0 63 6f 6e 66 69 67 75 72 65 64 20 77 69 74 68 20  configured with 
208b0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 6f  proxy locking mo
208c0 64 65 2c 20 75 73 65 20 74 68 65 20 6c 6f 63 61  de, use the loca
208d0 6c 20 0a 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  l .     ** lock 
208e0 66 69 6c 65 20 70 61 74 68 20 74 6f 20 64 65 74  file path to det
208f0 65 72 6d 69 6e 65 20 74 68 65 20 2d 73 68 6d 20  ermine the -shm 
20900 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20 20 2a  file path.     *
20910 2f 0a 20 20 20 20 69 66 28 20 69 73 50 72 6f 78  /.    if( isProx
20920 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 44 62  yLockingMode(pDb
20930 46 64 29 20 29 7b 0a 20 20 20 20 20 20 7a 42 61  Fd) ){.      zBa
20940 73 65 50 61 74 68 20 3d 20 70 72 6f 78 79 53 68  sePath = proxySh
20950 61 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61  aredMemoryBasePa
20960 74 68 28 70 44 62 46 64 29 3b 0a 20 20 20 20 20  th(pDbFd);.     
20970 20 69 66 28 20 21 7a 42 61 73 65 50 61 74 68 20   if( !zBasePath 
20980 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20990 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
209a0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
209b0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
209c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
209d0 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 64 65  endif.    .#ifde
209e0 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
209f0 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46  ECTORY.    nShmF
20a00 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66  ilename = sizeof
20a10 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  (SQLITE_SHM_DIRE
20a20 43 54 4f 52 59 29 20 2b 20 33 30 3b 0a 23 65 6c  CTORY) + 30;.#el
20a30 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  se.    nShmFilen
20a40 61 6d 65 20 3d 20 35 20 2b 20 28 69 6e 74 29 73  ame = 5 + (int)s
20a50 74 72 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29  trlen(zBasePath)
20a60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
20a70 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  mNode = sqlite3_
20a80 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
20a90 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d  pShmNode) + nShm
20aa0 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20  Filename );.    
20ab0 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
20ac0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
20ad0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
20ae0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
20af0 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  err;.    }.    m
20b00 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20  emset(pShmNode, 
20b10 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  0, sizeof(*pShmN
20b20 6f 64 65 29 29 3b 0a 20 20 20 20 7a 53 68 6d 46  ode));.    zShmF
20b30 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f  ilename = pShmNo
20b40 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  de->zFilename = 
20b50 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65  (char*)&pShmNode
20b60 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  [1];.#ifdef SQLI
20b70 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
20b80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
20b90 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
20ba0 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  me, zShmFilename
20bb0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
20bc0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
20bd0 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73  HM_DIRECTORY "/s
20be0 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22  qlite-shm-%x-%x"
20bf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20c00 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61         (u32)sSta
20c10 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73  t.st_ino, (u32)s
20c20 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65  Stat.st_dev);.#e
20c30 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  lse.    sqlite3_
20c40 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c  snprintf(nShmFil
20c50 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e  ename, zShmFilen
20c60 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a  ame, "%s-shm", z
20c70 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64 69  BasePath);.#endi
20c80 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  f.    pShmNode->
20c90 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46  h = -1;.    pDbF
20ca0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
20cb0 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
20cc0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49      pShmNode->pI
20cd0 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
20ce0 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  node;.    pShmNo
20cf0 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
20d00 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
20d10 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
20d20 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
20d30 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
20d40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
20d50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
20d60 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
20d70 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
20d80 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
20d90 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
20da0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
20db0 28 70 44 62 46 64 2d 3e 72 65 61 64 4f 6e 6c 79  (pDbFd->readOnly
20dc0 53 68 6d 20 3f 20 4f 5f 52 44 4f 4e 4c 59 20 3a  Shm ? O_RDONLY :
20dd0 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29   O_RDWR|O_CREAT)
20de0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
20df0 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65  ->h = robust_ope
20e00 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  n(zShmFilename, 
20e10 66 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74  flags, (sStat.st
20e20 5f 6d 6f 64 65 20 26 20 30 37 37 37 29 29 3b 0a  _mode & 0777));.
20e30 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
20e40 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
20e50 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
20e60 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
20e70 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
20e80 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
20e90 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
20ea0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
20eb0 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e     }.      pShmN
20ec0 6f 64 65 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ode->readOnly = 
20ed0 70 44 62 46 64 2d 3e 72 65 61 64 4f 6e 6c 79 53  pDbFd->readOnlyS
20ee0 68 6d 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  hm;.  .      /* 
20ef0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
20f00 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
20f10 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
20f20 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
20f30 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c        ** If not,
20f40 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20   zero the first 
20f50 66 65 77 20 62 79 74 65 73 20 6f 66 20 74 68 65  few bytes of the
20f60 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
20f70 69 6c 65 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ile to make.    
20f80 20 20 2a 2a 20 73 75 72 65 20 69 74 20 69 73 20    ** sure it is 
20f90 6e 6f 74 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72  not mistaken for
20fa0 20 76 61 6c 69 64 20 62 79 20 63 6f 64 65 20 69   valid by code i
20fb0 6e 20 77 61 6c 2e 63 2e 20 45 78 63 65 70 74 2c  n wal.c. Except,
20fc0 20 69 66 20 74 68 69 73 20 0a 20 20 20 20 20 20   if this .      
20fd0 2a 2a 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  ** is a read-onl
20fe0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  y connection to 
20ff0 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
21000 79 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  y then it is not
21010 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
21020 2a 2a 20 74 6f 20 63 68 65 63 6b 20 63 68 65 63  ** to check chec
21030 6b 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  k if another pro
21040 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
21050 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
21060 68 65 20 44 4d 53 0a 20 20 20 20 20 20 2a 2a 20  he DMS.      ** 
21070 62 79 74 65 2c 20 61 73 20 77 65 20 63 61 6e 6e  byte, as we cann
21080 6f 74 20 61 74 74 65 6d 70 74 20 61 20 77 72 69  ot attempt a wri
21090 74 65 2d 6c 6f 63 6b 20 76 69 61 20 61 20 72 65  te-lock via a re
210a0 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 0a 20 20  ad-only file .  
210b0 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
210c0 72 2e 20 53 6f 20 69 6e 20 74 68 69 73 20 63 61  r. So in this ca
210d0 73 65 2c 20 77 65 20 6a 75 73 74 20 61 73 73 75  se, we just assu
210e0 6d 65 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  me the shared-me
210f0 6d 6f 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 63  mory .      ** c
21100 6f 6e 74 65 6e 74 73 20 61 72 65 20 4f 6b 20 61  ontents are Ok a
21110 6e 64 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a  nd proceed.  */.
21120 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
21130 64 65 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  de->readOnly==0 
21140 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
21160 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79     if( unixShmSy
21170 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
21180 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58  e, F_WRLCK, UNIX
21190 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51  _SHM_DMS, 1)==SQ
211a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
211b0 20 20 20 20 20 69 66 28 20 70 44 62 46 64 2d 3e       if( pDbFd->
211c0 72 65 61 64 4f 6e 6c 79 53 68 6d 20 29 7b 0a 20  readOnlyShm ){. 
211d0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
211e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
211f0 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  OPEN;.          
21200 7d 65 6c 73 65 20 69 66 28 20 34 21 3d 6f 73 57  }else if( 4!=osW
21210 72 69 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  rite(pShmNode->h
21220 2c 20 22 5c 30 30 5c 30 30 5c 30 30 5c 30 30 22  , "\00\00\00\00"
21230 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 4) ){.        
21240 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
21250 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
21260 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72  RR_SHMOPEN, "ftr
21270 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c  uncate", zShmFil
21280 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
21290 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
212a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
212b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
212c0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
212d0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
212e0 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55  Node, F_RDLCK, U
212f0 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  NIX_SHM_DMS, 1);
21300 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21310 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
21320 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
21330 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21340 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 6e  ..  /* If the un
21350 69 78 53 68 6d 4e 6f 64 65 20 69 73 20 72 65 61  ixShmNode is rea
21360 64 2d 6f 6e 6c 79 2c 20 62 75 74 20 53 51 4c 49  d-only, but SQLI
21370 54 45 5f 46 43 4e 54 4c 5f 52 45 41 44 4f 4e 4c  TE_FCNTL_READONL
21380 59 5f 53 48 4d 20 68 61 73 20 6e 6f 74 0a 20 20  Y_SHM has not.  
21390 2a 2a 20 62 65 65 6e 20 73 65 74 20 66 6f 72 20  ** been set for 
213a0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
213b0 70 44 62 46 64 2c 20 72 65 74 75 72 6e 20 61 6e  pDbFd, return an
213c0 20 65 72 72 6f 72 2e 20 54 68 65 20 77 61 6c 2e   error. The wal.
213d0 63 20 6d 6f 64 75 6c 65 0a 20 20 2a 2a 20 77 69  c module.  ** wi
213e0 6c 6c 20 74 68 65 6e 20 63 61 6c 6c 20 74 68 69  ll then call thi
213f0 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
21400 20 77 69 74 68 20 53 51 4c 49 54 45 5f 46 43 4e   with SQLITE_FCN
21410 54 4c 5f 52 45 41 44 4f 4e 4c 59 5f 53 48 4d 20  TL_READONLY_SHM 
21420 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  set..  */.  else
21430 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 72   if( pShmNode->r
21440 65 61 64 4f 6e 6c 79 20 26 26 20 21 70 44 62 46  eadOnly && !pDbF
21450 64 2d 3e 72 65 61 64 4f 6e 6c 79 53 68 6d 20 29  d->readOnlyShm )
21460 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
21470 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3b  E_IOERR_SHMOPEN;
21480 0a 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  .    goto shm_op
21490 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f  en_err;.  }..  /
214a0 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63  * Make the new c
214b0 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c  onnection a chil
214c0 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d  d of the unixShm
214d0 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
214e0 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
214f0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
21500 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20  DEBUG.  p->id = 
21510 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
21520 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
21530 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
21540 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
21550 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  = p;.  unixLeave
21560 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54  Mutex();..  /* T
21570 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
21580 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68  nt on pShmNode h
21590 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
215a0 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65  incremented unde
215b0 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72  r.  ** the cover
215c0 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65   of the unixEnte
215d0 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
215e0 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
215f0 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
21600 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d   (struct unixShm
21610 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  ) object to the 
21620 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65  pShmNode has bee
21630 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20  n set. All that 
21640 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20  is.  ** left to 
21650 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68  do is to link th
21660 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74  e new object int
21670 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
21680 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  t starting.  ** 
21690 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  at pShmNode->pFi
216a0 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62  rst. This must b
216b0 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c  e done while hol
216c0 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64  ding the pShmNod
216d0 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d  e->mutex .  ** m
216e0 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  utex..  */.  sql
216f0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
21700 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
21710 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
21720 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
21730 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  ;.  pShmNode->pF
21740 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  irst = p;.  sqli
21750 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
21760 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
21770 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21780 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
21790 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72   here on any err
217a0 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65  or */.shm_open_e
217b0 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72  rr:.  unixShmPur
217c0 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20  ge(pDbFd);      
217d0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
217e0 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
217f0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
21800 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
21810 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
21820 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
21830 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
21840 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
21850 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
21860 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
21870 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
21880 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
21890 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
218a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
218b0 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
218c0 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
218d0 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
218e0 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
218f0 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
21900 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
21910 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
21920 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
21930 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
21940 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
21950 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
21960 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
21970 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
21980 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45  rwise, if the bE
21990 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20  xtend parameter 
219a0 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
219b0 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
219c0 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
219d0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
219e0 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
219f0 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
21a00 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
21a10 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
21a20 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
21a30 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
21a40 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
21a50 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45  urned. If .** bE
21a60 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  xtend is non-zer
21a70 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
21a80 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
21a90 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
21aa0 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
21ab0 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
21ac0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
21ad0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
21ae0 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
21af0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
21b00 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
21b10 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
21b20 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
21b30 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
21b40 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
21b50 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
21b60 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
21b70 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
21b80 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
21b90 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
21ba0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
21bb0 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
21bc0 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
21bd0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
21be0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
21bf0 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  nixShmMap(.  sql
21c00 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
21c30 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
21c40 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
21c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c60 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
21c70 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
21c80 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21ca0 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
21cb0 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64  */.  int bExtend
21cc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21cd0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
21ce0 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
21cf0 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
21d00 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21d20 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
21d30 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ory */.){.  unix
21d40 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
21d50 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75  nixFile*)fd;.  u
21d60 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69  nixShm *p;.  uni
21d70 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
21d80 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
21d90 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
21da0 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
21db0 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f  mory file has no
21dc0 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
21dd0 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
21de0 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e  */.  if( pDbFd->
21df0 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pShm==0 ){.    r
21e00 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72  c = unixOpenShar
21e10 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b  edMemory(pDbFd);
21e20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
21e30 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
21e40 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70  rc;.  }..  p = p
21e50 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53  DbFd->pShm;.  pS
21e60 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
21e70 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Node;.  sqlite3_
21e80 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
21e90 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
21ea0 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e  assert( szRegion
21eb0 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65  ==pShmNode->szRe
21ec0 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  gion || pShmNode
21ed0 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a  ->nRegion==0 );.
21ee0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
21ef0 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
21f00 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61  d->pInode );.  a
21f10 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
21f20 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e  >h>=0 || pDbFd->
21f30 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
21f40 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73  Lock==1 );.  ass
21f50 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
21f60 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  <0 || pDbFd->pIn
21f70 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
21f80 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  k==0 );..  if( p
21f90 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
21fa0 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
21fb0 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20   char **apNew;  
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fd0 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67      /* New apReg
21fe0 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ion[] array */. 
21ff0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
22000 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67  iRegion+1)*szReg
22010 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  ion;  /* Minimum
22020 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   required file s
22030 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ize */.    struc
22040 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
22050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22060 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29   Used by fstat()
22070 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
22080 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
22090 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28  Region;..    if(
220a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
220b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
220c0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
220d0 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
220e0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
220f0 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
22100 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b  ..      ** Check
22110 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
22120 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
22130 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
22140 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
22150 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65        ** large e
22160 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
22170 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
22180 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f  egion)..      */
22190 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
221a0 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  at(pShmNode->h, 
221b0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
221c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
221d0 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20  OERR_SHMSIZE;.  
221e0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
221f0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
22200 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74    .      if( sSt
22210 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65  at.st_size<nByte
22220 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
22230 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
22240 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
22250 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45  not exist. If bE
22260 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a  xtend is set to.
22270 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65          ** false
22280 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
22290 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
222a0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
222b0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
222c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
222d0 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   ** Alternativel
222e0 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73  y, if bExtend is
222f0 20 74 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e   true, use ftrun
22300 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
22310 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  te.        ** th
22320 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
22330 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20  ry region..     
22340 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
22350 28 20 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74  ( !bExtend ) got
22360 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
22370 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73         if( robus
22380 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d  t_ftruncate(pShm
22390 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20  Node->h, nByte) 
223a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
223b0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
223c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
223d0 49 5a 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  IZE, "ftruncate"
223e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
223f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
22400 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
22410 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
22420 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
22430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22440 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
22450 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65  Map the requeste
22460 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
22470 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
22480 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
22490 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20  e. */.    apNew 
224a0 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74  = (char **)sqlit
224b0 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
224c0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
224d0 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e  Region, (iRegion
224e0 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  +1)*sizeof(char 
224f0 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
22500 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
22510 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
22520 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
22530 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
22540 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
22550 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20  mNode->apRegion 
22560 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69  = apNew;.    whi
22570 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  le(pShmNode->nRe
22580 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a  gion<=iRegion){.
22590 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d        void *pMem
225a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d  ;.      if( pShm
225b0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
225c0 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61        pMem = mma
225d0 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 20 50  p(0, szRegion, P
225e0 52 4f 54 5f 52 45 41 44 7c 28 21 70 53 68 6d 4e  ROT_READ|(!pShmN
225f0 6f 64 65 2d 3e 72 65 61 64 4f 6e 6c 79 3f 50 52  ode->readOnly?PR
22600 4f 54 5f 57 52 49 54 45 3a 30 29 2c 20 0a 20 20  OT_WRITE:0), .  
22610 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48            MAP_SH
22620 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  ARED, pShmNode->
22630 68 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  h, pShmNode->nRe
22640 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a 20 20  gion*szRegion.  
22650 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
22660 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46   if( pMem==MAP_F
22670 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
22680 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
22690 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
226a0 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22  R_SHMMAP, "mmap"
226b0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  , pShmNode->zFil
226c0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
226d0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
226e0 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
226f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22700 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65     pMem = sqlite
22710 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f  3_malloc(szRegio
22720 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
22730 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pMem==0 ){.     
22740 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22750 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
22760 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
22770 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
22780 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65        memset(pMe
22790 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b  m, 0, szRegion);
227a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
227b0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
227c0 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
227d0 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20  ion] = pMem;.   
227e0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
227f0 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gion++;.    }.  
22800 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
22810 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
22820 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
22830 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68  ){.    *pp = pSh
22840 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
22850 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73  iRegion];.  }els
22860 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
22870 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
22880 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
22890 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
228a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
228b0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63  * Change the loc
228c0 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68  k state for a sh
228d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
228e0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ent..**.** Note 
228f0 74 68 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f  that the relatio
22900 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 53 48  nship between SH
22910 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49  AREd and EXCLUSI
22920 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69  VE locks is a li
22930 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e  ttle.** differen
22940 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70  t here than in p
22950 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f  osix.  In xShmLo
22960 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f  ck(), one can go
22970 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a   from unlocked.*
22980 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20  * to shared and 
22990 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c  back or from unl
229a0 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69  ocked to exclusi
229b0 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75  ve and back.  Bu
229c0 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74  t one may.** not
229d0 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20   go from shared 
229e0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20  to exclusive or 
229f0 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74  from exclusive t
22a00 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61  o shared..*/.sta
22a10 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c  tic int unixShmL
22a20 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
22a30 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
22a40 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
22a50 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
22a60 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
22a70 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22a90 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
22aa0 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
22ab0 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ad0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
22ae0 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
22af0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
22b00 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
22b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
22b20 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
22b30 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e   lock */.){.  un
22b40 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
22b50 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20  (unixFile*)fd;  
22b60 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
22b70 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
22b80 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69   memory */.  uni
22b90 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  xShm *p = pDbFd-
22ba0 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
22bb0 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
22bc0 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
22bd0 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68  cked */.  unixSh
22be0 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c00 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
22c10 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
22c20 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
22c30 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
22c40 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54  >pShmNode;  /* T
22c50 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69  he underlying fi
22c60 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  le iNode */.  in
22c70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22c90 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
22ca0 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b  de */.  u16 mask
22cb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22cd0 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74   Mask of locks t
22ce0 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73  o take or releas
22cf0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
22d00 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d  pShmNode==pDbFd-
22d10 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
22d20 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
22d30 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
22d40 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
22d50 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ;.  assert( ofst
22d60 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
22d70 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
22d80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
22d90 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
22da0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
22db0 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
22dc0 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
22dd0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
22de0 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
22df0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
22e00 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
22e10 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
22e20 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
22e30 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
22e40 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
22e50 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
22e60 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
22e70 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
22e80 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
22e90 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
22ea0 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
22eb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
22ec0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c  ShmNode->h>=0 ||
22ed0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
22ee0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20  bProcessLock==1 
22ef0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
22f00 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44  mNode->h<0 || pD
22f10 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
22f20 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
22f30 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f  .  mask = (1<<(o
22f40 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
22f50 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  st);.  assert( n
22f60 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
22f70 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
22f80 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
22f90 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
22fa0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
22fb0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
22fc0 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
22fd0 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
22fe0 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
22ff0 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
23000 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
23010 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
23020 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
23030 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
23040 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
23050 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
23060 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
23070 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23080 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
23090 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
230a0 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
230b0 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
230c0 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
230d0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
230e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
230f0 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
23100 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
23110 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
23120 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
23130 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
23140 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
23150 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73  de, F_UNLCK, ofs
23160 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
23170 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
23180 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23190 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
231a0 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
231b0 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
231c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
231d0 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
231e0 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
231f0 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
23200 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
23210 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
23220 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
23230 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
23240 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
23250 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
23260 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
23270 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
23280 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
23290 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
232a0 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
232b0 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
232c0 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
232d0 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
232e0 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
232f0 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
23300 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
23310 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
23320 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
23330 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
23340 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
23350 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
23360 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
23370 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
23380 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
23390 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
233a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
233b0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
233c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
233d0 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
233e0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
233f0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
23400 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
23410 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
23420 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
23430 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23440 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
23450 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
23460 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
23470 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
23480 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
23490 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66  ode, F_RDLCK, of
234a0 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
234b0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
234c0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
234d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
234e0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
234f0 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
23500 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
23510 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
23530 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
23540 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
23550 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
23560 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
23570 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
23580 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
23590 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
235a0 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
235b0 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
235c0 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
235d0 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
235e0 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
235f0 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
23600 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
23610 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
23620 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
23630 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
23640 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
23650 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23660 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
23670 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
23680 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
23690 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
236a0 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
236b0 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
236c0 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
236d0 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
236e0 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
236f0 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
23700 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
23710 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
23730 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
23740 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
23750 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _WRLCK, ofst+UNI
23760 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
23770 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
23780 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23790 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
237a0 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
237b0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
237c0 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  p->exclMask |= m
237d0 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
237e0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
237f0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
23800 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
23810 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
23820 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69  OCK shmid-%d, pi
23830 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30  d-%d got %03x,%0
23840 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
23850 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28    p->id, getpid(
23860 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ), p->sharedMask
23870 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b  , p->exclMask));
23880 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23890 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
238a0 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
238b0 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
238c0 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
238d0 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
238e0 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
238f0 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
23900 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
23910 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
23920 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
23930 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
23940 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
23950 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
23960 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71  ShmBarrier(.  sq
23970 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20  lite3_file *fd  
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23990 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
239a0 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
239b0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
239c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
239d0 52 28 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74  R(fd);.  unixEnt
239e0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e 69  erMutex();.  uni
239f0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
23a00 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
23a10 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
23a20 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
23a30 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
23a40 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
23a50 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
23a60 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
23a70 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72  there is no shar
23a80 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
23a90 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  ated with the co
23aa0 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68  nnection then th
23ab0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
23ac0 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
23ad0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
23ae0 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20   unixShmUnmap(. 
23af0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
23b00 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
23b10 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
23b20 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
23b30 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
23b40 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
23b50 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
23b60 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66  shared-memory if
23b70 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
23b80 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  ixShm *p;       
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23ba0 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
23bb0 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
23bc0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
23bd0 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20  ShmNode;        
23be0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
23bf0 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
23c00 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  y file */.  unix
23c10 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20  Shm **pp;       
23c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23c30 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
23c40 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
23c50 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ons */.  unixFil
23c60 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
23c70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23c80 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
23c90 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70  ase file */..  p
23ca0 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
23cb0 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46  *)fd;.  p = pDbF
23cc0 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70  d->pShm;.  if( p
23cd0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
23ce0 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f  ITE_OK;.  pShmNo
23cf0 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
23d00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  ;..  assert( pSh
23d10 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  mNode==pDbFd->pI
23d20 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29  node->pShmNode )
23d30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
23d40 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
23d50 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a  bFd->pInode );..
23d60 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
23d70 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
23d80 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
23d90 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ions associated.
23da0 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f    ** with pShmNo
23db0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
23dc0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
23dd0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
23de0 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
23df0 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
23e00 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
23e10 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
23e20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
23e30 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
23e40 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
23e50 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
23e60 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
23e70 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
23e80 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
23e90 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
23ea0 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
23eb0 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
23ec0 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
23ed0 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
23ee0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
23ef0 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78  e, too */.  unix
23f00 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
23f10 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
23f20 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
23f30 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
23f40 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
23f50 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69  nRef==0 ){.    i
23f60 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26  f( deleteFlag &&
23f70 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
23f80 29 20 75 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64  ) unlink(pShmNod
23f90 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
23fa0 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28     unixShmPurge(
23fb0 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  pDbFd);.  }.  un
23fc0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
23fd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23fe0 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23  _OK;.}...#else.#
23ff0 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d   define unixShmM
24000 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
24010 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20  e unixShmLock   
24020 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
24030 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
24040 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d  efine unixShmUnm
24050 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
24060 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
24070 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
24080 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
24090 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
240a0 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  of all sqlite3_f
240b0 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a  ile methods..**.
240c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
240d0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74  ****** End sqlit
240e0 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20  e3_file Methods 
240f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
24110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
24160 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  ./*.** This divi
24170 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65  sion contains de
24180 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c  finitions of sql
24190 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
241a0 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20  objects that.** 
241b0 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75  implement variou
241c0 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73  s file locking s
241d0 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61  trategies.  It a
241e0 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  lso contains def
241f0 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22  initions.** of "
24200 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
24210 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e  s.  A finder-fun
24220 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
24230 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72   locate the appr
24240 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74  opriate.** sqlit
24250 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
24260 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69  ject for a parti
24270 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66  cular database f
24280 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61  ile.  The pAppDa
24290 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ta.** field of t
242a0 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56  he sqlite3_vfs V
242b0 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69  FS objects are i
242c0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65  nitialized to be
242d0 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
242e0 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64  the correct find
242f0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er-function for 
24300 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20  that VFS..**.** 
24310 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63  Most finder func
24320 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70  tions return a p
24330 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65  ointer to a fixe
24340 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  d sqlite3_io_met
24350 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20  hods.** object. 
24360 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65   The only intere
24370 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e  sting finder-fun
24380 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63  ction is autoloc
24390 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68  kIoFinder, which
243a0 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  .** looks at the
243b0 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
243c0 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75   and tries to gu
243d0 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ess the best loc
243e0 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79  king.** strategy
243f0 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a   from that..**.*
24400 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e  * For finder-fun
24410 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65  tion F, two obje
24420 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a  cts are created:
24430 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68  .**.**    (1) Th
24440 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75  e real finder-fu
24450 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49  nction named "FI
24460 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  mpt()"..**.**   
24470 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20   (2) A constant 
24480 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
24490 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a  function named j
244a0 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a  ust "F"..**.**.*
244b0 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * A pointer to t
244c0 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20  he F pointer is 
244d0 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70  used as the pApp
244e0 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56  Data value for V
244f0 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20  FS.** objects.  
24500 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68  We have to do th
24510 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65  is instead of le
24520 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70  tting pAppData p
24530 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79  oint.** directly
24540 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66   at the finder-f
24550 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39  unction since C9
24560 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20  0 rules prevent 
24570 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20  a void*.** from 
24580 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66  be cast into a f
24590 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e  unction pointer.
245a0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69  .**.**.** Each i
245b0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
245c0 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20  macro generates 
245d0 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a  two objects:.**.
245e0 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61  **   *  A consta
245f0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  nt sqlite3_io_me
24600 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c  thods object cal
24610 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61  l METHOD that ha
24620 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20  s locking.**    
24630 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c    methods CLOSE,
24640 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
24650 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  KRESLOCK..**.** 
24660 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68    *  An I/O meth
24670 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
24680 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52  on called FINDER
24690 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20   that returns a 
246a0 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20  pointer.**      
246b0 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62  to the METHOD ob
246c0 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76  ject in the prev
246d0 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a  ious bullet..*/.
246e0 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44  #define IOMETHOD
246f0 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44  S(FINDER, METHOD
24700 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45  , VERSION, CLOSE
24710 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20  , LOCK, UNLOCK, 
24720 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73  CKLOCK)      \.s
24730 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
24740 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d  te3_io_methods M
24750 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20  ETHOD = {       
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
24780 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20   VERSION,       
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
247a0 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20  iVersion */     
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
247d0 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
247e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
247f0 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
24800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24810 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
24820 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20  nixRead,        
24830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
24840 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ead */          
24850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24860 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
24870 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  ixWrite,        
24880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
24890 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ite */          
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248b0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
248c0 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  xTruncate,      
248d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
248e0 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20  ncate */        
248f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24900 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
24910 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
24920 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
24930 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
24940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24950 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
24960 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
24970 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
24980 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
24990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249a0 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20       \.   LOCK, 
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249c0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
249d0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249f0 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c      \.   UNLOCK,
24a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a10 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
24a20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a40 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20     \.   CKLOCK, 
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a60 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
24a70 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20  ervedLock */    
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43    \.   unixFileC
24aa0 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
24ab0 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
24ac0 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ol */           
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ae0 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72   \.   unixSector
24af0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
24b00 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
24b10 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b30 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43  \.   unixDeviceC
24b40 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
24b50 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62   /* xDeviceCapab
24b60 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20  ilities */      
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
24b80 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20  .   unixShmMap, 
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ba0 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20  /* xShmMap */   
24bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
24bd0 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20     unixShmLock, 
24be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24bf0 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20  * xShmLock */   
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
24c20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72    unixShmBarrier
24c30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
24c40 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20   xShmBarrier */ 
24c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c60 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
24c70 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20   unixShmUnmap   
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24c90 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20  xShmUnmap */    
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cb0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20             \.}; 
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d00 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
24d10 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
24d20 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e  _io_methods *FIN
24d30 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20  DER##Impl(const 
24d40 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c  char *z, unixFil
24d50 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55  e *p){   \.  UNU
24d60 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29  SED_PARAMETER(z)
24d70 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ; UNUSED_PARAMET
24d80 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20  ER(p);          
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24da0 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75          \.  retu
24db0 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20  rn &METHOD;     
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24df0 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20         \.}      
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e40 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
24e50 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
24e60 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
24e70 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63   FINDER)(const c
24e80 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70  har*,unixFile *p
24e90 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e  )    \.    = FIN
24ea0 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a  DER##Impl;../*.*
24eb0 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f  * Here are all o
24ec0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  f the sqlite3_io
24ed0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
24ee0 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
24ef0 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  .** locking stra
24f00 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f  tegies.  Functio
24f10 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70  ns that return p
24f20 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65  ointers to these
24f30 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20   methods.** are 
24f40 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f  also created..*/
24f50 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f  .IOMETHODS(.  po
24f60 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  sixIoFinder,    
24f70 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
24f80 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
24f90 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68  */.  posixIoMeth
24fa0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
24fb0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
24fc0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
24fd0 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20   */.  2,        
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ff0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
25000 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
25010 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
25020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
25030 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
25040 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
25050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
25060 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
25070 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  unixUnlock,     
25080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
25090 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
250a0 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
250b0 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43  edLock     /* xC
250c0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
250d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
250e0 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b  ETHODS(.  nolock
250f0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
25100 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
25110 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
25120 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73   nolockIoMethods
25130 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ,          /* sq
25140 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
25150 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
25160 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
25170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
25180 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
25190 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f  disabled */.  no
251a0 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
251b0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
251c0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  e method */.  no
251d0 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
251e0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
251f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
25200 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
25210 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
25220 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
25230 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
25240 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63  dLock   /* xChec
25250 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
25260 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
25270 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  ODS(.  dotlockIo
25280 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
25290 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
252a0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f  ion name */.  do
252b0 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  tlockIoMethods, 
252c0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
252d0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
252e0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
252f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25300 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
25310 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
25320 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  abled */.  dotlo
25330 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
25340 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
25350 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
25360 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
25370 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
25380 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
25390 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
253a0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
253b0 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
253c0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
253d0 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ock  /* xCheckRe
253e0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
253f0 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49  d */.)..#if SQLI
25400 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
25410 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
25420 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
25430 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65  (.  flockIoFinde
25440 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
25450 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
25460 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b   name */.  flock
25470 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
25480 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
25490 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
254a0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
254d0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
254e0 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f  ed */.  flockClo
254f0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
25500 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
25510 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63  od */.  flockLoc
25520 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
25530 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
25540 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f  d */.  flockUnlo
25550 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
25560 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
25570 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65  od */.  flockChe
25580 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
25590 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
255a0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
255b0 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
255c0 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54  OS_VXWORKS.IOMET
255d0 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e  HODS(.  semIoFin
255e0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
255f0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
25600 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73  tion name */.  s
25610 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  emIoMethods,    
25620 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
25630 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
25640 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
25650 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
25660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
25670 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
25680 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43  sabled */.  semC
25690 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
256a0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
256b0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c  method */.  semL
256c0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
256d0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
256e0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e  ethod */.  semUn
256f0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
25700 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
25710 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43  method */.  semC
25720 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
25730 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
25740 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
25750 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
25760 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
25770 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
25780 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
25790 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
257a0 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20  .  afpIoFinder, 
257b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
257c0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
257d0 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d  name */.  afpIoM
257e0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
257f0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
25800 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
25810 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
25820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25830 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
25840 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
25850 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c  d */.  afpClose,
25860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25870 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
25880 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20  d */.  afpLock, 
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
258b0 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c   */.  afpUnlock,
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258d0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
258e0 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52  d */.  afpCheckR
258f0 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
25900 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
25910 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
25920 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .).#endif../*.**
25930 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   The proxy locki
25940 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22  ng method is a "
25950 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e  super-method" in
25960 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
25970 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f  it.** opens seco
25980 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72  ndary file descr
25990 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  iptors for the c
259a0 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69  onch and lock fi
259b0 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73  les and.** it us
259c0 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69  es proxy, dot-fi
259d0 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f  le, AFP, and flo
259e0 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ck() locking met
259f0 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a  hods on those.**
25a00 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73   secondary files
25a10 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
25a20 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
25a30 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
25a40 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** proxy lockin
25a50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63  g is located muc
25a60 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69  h further down i
25a70 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74  n the file.  But
25a80 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67   we need.** to g
25a90 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69  o ahead and defi
25aa0 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ne the sqlite3_i
25ab0 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69  o_methods and fi
25ac0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  nder function.**
25ad0 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
25ae0 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20  ng here.  So we 
25af0 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20  forward declare 
25b00 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e  the I/O methods.
25b10 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
25b20 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
25b30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
25b40 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
25b50 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28   int proxyClose(
25b60 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
25b70 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
25b80 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
25b90 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
25ba0 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b   int proxyUnlock
25bb0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
25bc0 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
25bd0 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
25be0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
25bf0 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f  file*, int*);.IO
25c00 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79  METHODS(.  proxy
25c10 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
25c20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
25c30 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
25c40 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73    proxyIoMethods
25c50 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
25c60 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
25c70 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
25c80 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20  .  2,           
25c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ca0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
25cb0 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72   enabled */.  pr
25cc0 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  oxyClose,       
25cd0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
25ce0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  e method */.  pr
25cf0 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  oxyLock,        
25d00 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
25d10 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
25d20 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  xyUnlock,       
25d30 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
25d40 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
25d50 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
25d60 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
25d70 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
25d80 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
25d90 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f  ../* nfs lockd o
25da0 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73  n OSX 10.3+ does
25db0 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20  n't clear write 
25dc0 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61  locks when a rea
25dd0 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f  d lock is set */
25de0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
25df0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
25e00 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
25e10 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
25e20 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c  (.  nfsIoFinder,
25e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e40 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
25e50 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49  n name */.  nfsI
25e60 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
25e70 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
25e80 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
25e90 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
25ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
25ec0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
25ed0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
25ee0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
25ef0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
25f00 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
25f10 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
25f20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
25f30 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55  method */.  nfsU
25f40 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
25f50 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
25f60 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
25f70 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
25f80 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
25f90 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
25fa0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
25fb0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
25fc0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
25fd0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
25fe0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
25ff0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
26000 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
26010 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
26020 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
26030 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
26040 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26050 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
26060 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
26070 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
26080 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
26090 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
260a0 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
260b0 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
260c0 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
260d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
260e0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
260f0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
26100 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
26110 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
26120 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
26130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
26140 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
26150 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
26160 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
26170 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
26180 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
26190 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
261a0 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
261b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
261c0 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
261d0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
261e0 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
261f0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
26200 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
26210 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
26220 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
26230 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
26240 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
26250 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
26260 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
26270 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
26280 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
26290 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
262a0 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
262b0 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
262c0 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
262d0 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
262e0 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
262f0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
26300 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
26310 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
26320 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
26330 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
26340 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
26350 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
26360 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
26370 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
26380 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
26390 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
263a0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
263b0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
263c0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
263d0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
263e0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
263f0 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
26400 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
26410 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
26420 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
26430 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
26440 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
26450 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
26460 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
26470 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
26480 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
26490 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
264a0 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
264b0 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
264c0 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
264d0 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
264e0 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
264f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
26500 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
26510 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
26520 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
26530 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
26540 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
26550 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
26560 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
26570 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
26580 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
26590 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
265a0 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
265b0 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
265c0 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
265d0 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
265e0 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
265f0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
26600 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
26610 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
26620 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
26630 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
26640 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
26650 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
26660 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
26670 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
26680 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
26690 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
266a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
266b0 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
266c0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
266d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
266e0 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
266f0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
26700 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
26710 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
26720 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
26730 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
26740 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
26750 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
26760 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
26770 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
26780 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
26790 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
267a0 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
267b0 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51  OS_VXWORKS && SQ
267c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
267d0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
267e0 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
267f0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
26800 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
26810 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
26820 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
26830 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26840 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
26850 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
26860 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
26870 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
26880 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
26890 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
268a0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
268b0 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a   VXWorks only..*
268c0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
268d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
268e0 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
268f0 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
26900 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
26910 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
26920 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26930 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
26940 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
26950 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  * the open file 
26960 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
26970 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
26980 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
26990 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
269a0 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
269b0 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
269c0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
269d0 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
269e0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
269f0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
26a00 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
26a10 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
26a20 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a  IoMethods;.  }..
26a30 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e    /* Test if fcn
26a40 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65  tl() is supporte
26a50 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20  d and use POSIX 
26a60 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a  style locks..  *
26a70 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
26a80 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d   back to the nam
26a90 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74  ed semaphore met
26aa0 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  hod..  */.  lock
26ab0 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
26ac0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
26ad0 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
26ae0 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
26af0 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
26b00 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
26b10 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
26b20 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
26b30 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
26b40 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
26b50 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
26b60 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
26b70 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
26b80 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
26b90 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
26ba0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
26bb0 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
26bc0 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
26bd0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
26be0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
26bf0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
26c00 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
26c10 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
26c20 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
26c30 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
26c40 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
26c50 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
26c60 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
26c70 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
26c80 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
26c90 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
26ca0 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
26cb0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
26cc0 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
26cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d10 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
26d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d30 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
26d40 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
26d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d60 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
26d70 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
26d80 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
26d90 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
26da0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
26db0 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
26dc0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
26dd0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
26de0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
26df0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
26e00 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
26e10 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
26e20 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
26e30 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
26e40 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
26e50 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
26e60 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
26e70 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
26e80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
26e90 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
26ea0 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ened */.  int di
26eb0 72 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  rfd,            
26ec0 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66    /* Directory f
26ed0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
26ee0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
26ef0 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
26f00 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
26f10 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
26f20 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
26f30 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
26f40 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
26f50 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
26f60 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  d */.  int noLoc
26f70 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
26f80 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69  * Omit locking i
26f90 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  f true */.  int 
26fa0 69 73 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  isDelete,       
26fb0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
26fc0 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a   close if true *
26fd0 2f 0a 20 20 69 6e 74 20 69 73 52 65 61 64 4f 6e  /.  int isReadOn
26fe0 6c 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ly          /* T
26ff0 72 75 65 20 69 66 20 74 68 65 20 66 69 6c 65 20  rue if the file 
27000 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
27010 6e 6c 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  nly */.){.  cons
27020 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
27030 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74  hods *pLockingSt
27040 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  yle;.  unixFile 
27050 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c  *pNew = (unixFil
27060 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72  e *)pId;.  int r
27070 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
27080 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
27090 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a  pInode==NULL );.
270a0 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20  .  /* Parameter 
270b0 69 73 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79  isDelete is only
270c0 20 75 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73   used on vxworks
270d0 2e 20 45 78 70 72 65 73 73 20 74 68 69 73 20 65  . Express this e
270e0 78 70 6c 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20  xplicitly .  ** 
270f0 68 65 72 65 20 74 6f 20 70 72 65 76 65 6e 74 20  here to prevent 
27100 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
27110 73 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70  s about unused p
27120 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a  arameters..  */.
27130 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
27140 45 52 28 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20  ER(isDelete);.. 
27150 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20   /* Usually the 
27160 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73  path zFilename s
27170 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72  hould not be a r
27180 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
27190 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70  . The.  ** excep
271a0 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65  tion is when ope
271b0 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22  ning the proxy "
271c0 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62  conch" file in b
271d0 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20  uilds that.  ** 
271e0 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63  include the spec
271f0 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e  ial Apple lockin
27200 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23  g styles..  */.#
27210 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
27220 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
27230 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
27240 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a  TYLE.  assert( z
27250 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
27260 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
27270 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70   .    || pVfs->p
27280 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29  AppData==(void*)
27290 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  &autolockIoFinde
272a0 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73  r );.#else.  ass
272b0 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ert( zFilename==
272c0 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
272d0 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66  ]=='/' );.#endif
272e0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
272f0 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22  EN    %-3d %s\n"
27300 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  , h, zFilename))
27310 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b  ;.  pNew->h = h;
27320 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d  .  pNew->dirfd =
27330 20 64 69 72 66 64 3b 0a 20 20 70 4e 65 77 2d 3e   dirfd;.  pNew->
27340 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  zPath = zFilenam
27350 65 3b 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  e;.  if( memcmp(
27360 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69  pVfs->zName,"uni
27370 78 2d 65 78 63 6c 22 2c 31 30 29 3d 3d 30 20 29  x-excl",10)==0 )
27380 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
27390 46 6c 61 67 73 20 3d 20 55 4e 49 58 46 49 4c 45  Flags = UNIXFILE
273a0 5f 45 58 43 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _EXCL;.  }else{.
273b0 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
273c0 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ags = 0;.  }.  i
273d0 66 28 20 69 73 52 65 61 64 4f 6e 6c 79 20 29 7b  f( isReadOnly ){
273e0 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
273f0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
27400 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 23 69  _RDONLY;.  }..#i
27410 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70  f OS_VXWORKS.  p
27420 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72  New->pId = vxwor
27430 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69  ksFindFileId(zFi
27440 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  lename);.  if( p
27450 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20  New->pId==0 ){. 
27460 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20     noLock = 1;. 
27470 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
27480 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
27490 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29  ..  if( noLock )
274a0 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
274b0 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  yle = &nolockIoM
274c0 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
274d0 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
274e0 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f  le = (**(finder_
274f0 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70  type*)pVfs->pApp
27500 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c  Data)(zFilename,
27510 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49   pNew);.#if SQLI
27520 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
27530 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43  G_STYLE.    /* C
27540 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69  ache zFilename i
27550 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
27560 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64  ntext (AFP and d
27570 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29  otlock override)
27580 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78   for.    ** prox
27590 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e  yLock activation
275a0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65   is possible (re
275b0 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61  mote proxy is ba
275c0 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a  sed on db name).
275d0 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65      ** zFilename
275e0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
275f0 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  ntil file is clo
27600 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20  sed, to support 
27610 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  */.    pNew->loc
27620 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76  kingContext = (v
27630 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a  oid*)zFilename;.
27640 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
27650 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
27660 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  == &posixIoMetho
27670 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ds.#if defined(_
27680 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
27690 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
276a0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20  NG_STYLE.    || 
276b0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
276c0 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23   &nfsIoMethods.#
276d0 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75  endif.  ){.    u
276e0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
276f0 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e  .    rc = findIn
27700 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
27710 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
27720 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27730 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
27740 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
27750 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65  red in findInode
27760 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68  Info(), close th
27770 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
27780 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64  r.      ** immed
27790 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72  iately, before r
277a0 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74  eleasing the mut
277b0 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  ex. findInodeInf
277c0 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20  o() may fail.   
277d0 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65     ** in two sce
277e0 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a  narios:.      **
277f0 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20  .      **   (a) 
27800 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28  A call to fstat(
27810 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  ) failed..      
27820 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f  **   (b) A mallo
27830 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  c failed..      
27840 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e  **.      ** Scen
27850 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c  ario (b) may onl
27860 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70  y occur if the p
27870 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
27880 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20  g no other.     
27890 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
278a0 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  tors open on the
278b0 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74   same file. If t
278c0 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20  here were other 
278d0 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
278e0 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69  scriptors on thi
278f0 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  s file, then no 
27900 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20  malloc would be 
27910 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
27920 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e    ** findInodeIn
27930 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73  fo(). If this is
27940 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73   the case, it is
27950 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63   quite safe to c
27960 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  lose.      ** ha
27970 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69  ndle h - as it i
27980 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
27990 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73  t no posix locks
279a0 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65   will be release
279b0 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f  d.      ** by do
279c0 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a  ing so..      **
279d0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65  .      ** If sce
279e0 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64  nario (a) caused
279f0 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20   the error then 
27a00 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73  things are not s
27a10 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20  o safe. The.    
27a20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73    ** implicit as
27a30 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73  sumption here is
27a40 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29   that if fstat()
27a50 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61   fails, things a
27a60 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73  re in.      ** s
27a70 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68  uch bad shape th
27a80 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f  at dropping a lo
27a90 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27  ck or two doesn'
27aa0 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20  t matter much.. 
27ab0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f       */.      ro
27ac0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
27ad0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
27ae0 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
27af0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
27b00 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69  Mutex();.  }..#i
27b10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
27b20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
27b30 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
27b40 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70  __).  else if( p
27b50 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
27b60 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
27b70 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b  .    /* AFP lock
27b80 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
27b90 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
27ba0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
27bb0 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
27bc0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
27bd0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66  t..    */.    af
27be0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
27bf0 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d  *pCtx;.    pNew-
27c00 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
27c10 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33  = pCtx = sqlite3
27c20 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
27c30 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66  *pCtx) );.    if
27c40 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
27c50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
27c60 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
27c70 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46  .      /* NB: zF
27c80 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61  ilename exists a
27c90 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  nd remains valid
27ca0 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20   until the file 
27cb0 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20  is closed.      
27cc0 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ** according to 
27cd0 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31  requirement F111
27ce0 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f  41.  So we do no
27cf0 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  t need to make a
27d00 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
27d10 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20  f the filename. 
27d20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64  */.      pCtx->d
27d30 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  bPath = zFilenam
27d40 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72  e;.      pCtx->r
27d50 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20  eserved = 0;.   
27d60 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b     srandomdev();
27d70 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72  .      unixEnter
27d80 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72  Mutex();.      r
27d90 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
27da0 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
27db0 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66  Inode);.      if
27dc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27dd0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27de0 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f  e3_free(pNew->lo
27df0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
27e00 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c         robust_cl
27e10 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
27e20 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20  INE__);.        
27e30 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  h = -1;.      }.
27e40 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
27e50 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a  utex();        .
27e60 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
27e70 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  ..  else if( pLo
27e80 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64  ckingStyle == &d
27e90 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  otlockIoMethods 
27ea0 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c  ){.    /* Dotfil
27eb0 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
27ec0 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
27ed0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
27ee0 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a  ncluded in.    *
27ef0 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63  * the dotlockLoc
27f00 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20  kingContext .   
27f10 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c   */.    char *zL
27f20 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74  ockFile;.    int
27f30 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   nFilename;.    
27f40 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74  nFilename = (int
27f50 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d  )strlen(zFilenam
27f60 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63  e) + 6;.    zLoc
27f70 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
27f80 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
27f90 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
27fa0 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20  f( zLockFile==0 
27fb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
27fc0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
27fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
27fe0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46  ite3_snprintf(nF
27ff0 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69  ilename, zLockFi
28000 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b  le, "%s" DOTLOCK
28010 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61  _SUFFIX, zFilena
28020 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
28030 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
28040 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b  ext = zLockFile;
28050 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
28060 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20  ORKS.  else if( 
28070 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
28080 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29   &semIoMethods )
28090 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73  {.    /* Named s
280a0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
280b0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
280c0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
280d0 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63  to be.    ** inc
280e0 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d  luded in the sem
280f0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20  LockingContext. 
28100 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e     */.    unixEn
28110 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
28120 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
28130 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
28140 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
28150 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
28160 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64   && (pNew->pInod
28170 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29  e->pSem==NULL) )
28180 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
28190 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70  emName = pNew->p
281a0 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b  Inode->aSemName;
281b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
281c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
281d0 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
281e0 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25  E, zSemName, "/%
281f0 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20  s.sem",.        
28200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28210 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  New->pId->zCanon
28220 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  icalName);.     
28230 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e   for( n=1; zSemN
28240 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20  ame[n]; n++ ).  
28250 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61        if( zSemNa
28260 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65  me[n]=='/' ) zSe
28270 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a  mName[n] = '_';.
28280 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
28290 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f  de->pSem = sem_o
282a0 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f  pen(zSemName, O_
282b0 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b  CREAT, 0666, 1);
282c0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
282d0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d  >pInode->pSem ==
282e0 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20   SEM_FAILED ){. 
282f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28300 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
28310 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
28320 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c  aSemName[0] = '\
28330 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
28340 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
28350 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
28360 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61  if.  .  pNew->la
28370 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66  stErrno = 0;.#if
28380 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
28390 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
283a0 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
283b0 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
283c0 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
283d0 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  );.    h = -1;. 
283e0 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e     unlink(zFilen
283f0 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65  ame);.    isDele
28400 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  te = 0;.  }.  pN
28410 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 69  ew->isDelete = i
28420 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a  sDelete;.#endif.
28430 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28440 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64  _OK ){.    if( d
28450 69 72 66 64 3e 3d 30 20 29 20 72 6f 62 75 73 74  irfd>=0 ) robust
28460 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 64 69 72  _close(pNew, dir
28470 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
28480 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
28490 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
284a0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
284b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
284c0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63  ->pMethod = pLoc
284d0 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f  kingStyle;.    O
284e0 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
284f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
28510 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
28520 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
28530 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
28540 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
28550 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
28560 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
28570 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
28580 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
28590 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
285a0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
285b0 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
285c0 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
285d0 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
285e0 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
285f0 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
28600 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
28610 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
28620 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
28630 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
28640 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
28650 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  ible for closing
28660 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
28670 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69  criptor *pFd usi
28680 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73  ng close()..*/.s
28690 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
286a0 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
286b0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ar *zFilename, i
286c0 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  nt *pFd){.  int 
286d0 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ii;.  int fd = -
286e0 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61  1;.  char zDirna
286f0 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
28700 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  1];..  sqlite3_s
28710 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
28720 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20  NAME, zDirname, 
28730 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  "%s", zFilename)
28740 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29  ;.  for(ii=(int)
28750 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29  strlen(zDirname)
28760 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61  ; ii>1 && zDirna
28770 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
28780 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
28790 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
287a0 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  i] = '\0';.    f
287b0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
287c0 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  zDirname, O_RDON
287d0 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b  LY|O_BINARY, 0);
287e0 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29  .    if( fd>=0 )
287f0 7b 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45  {.#ifdef FD_CLOE
28800 58 45 43 0a 20 20 20 20 20 20 6f 73 46 63 6e 74  XEC.      osFcnt
28810 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f  l(fd, F_SETFD, o
28820 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54  sFcntl(fd, F_GET
28830 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
28840 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  XEC);.#endif.   
28850 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
28860 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c  NDIR %-3d %s\n",
28870 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b   fd, zDirname));
28880 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46  .    }.  }.  *pF
28890 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e  d = fd;.  return
288a0 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f   (fd>=0?SQLITE_O
288b0 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  K:unixLogError(S
288c0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
288d0 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69  KPT, "open", zDi
288e0 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rname));.}../*.*
288f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
28900 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
28910 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74   in which to put
28920 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
28930 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61  ..** If no suita
28940 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ble temporary fi
28950 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e  le directory can
28960 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
28970 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
28980 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
28990 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f  ixTempFileDir(vo
289a0 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
289b0 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
289c0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20  [] = {.     0,. 
289d0 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61      0,.     "/va
289e0 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
289f0 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
28a00 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20 20  tmp",.     0    
28a10 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d      /* List term
28a20 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20  inator */.  };. 
28a30 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
28a40 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
28a50 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  uf;.  const char
28a60 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61   *zDir = 0;..  a
28a70 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
28a80 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
28a90 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73  y;.  if( !azDirs
28aa0 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20  [1] ) azDirs[1] 
28ab0 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  = getenv("TMPDIR
28ac0 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
28ad0 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f  <sizeof(azDirs)/
28ae0 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d  sizeof(azDirs[0]
28af0 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69  ); zDir=azDirs[i
28b00 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  ++]){.    if( zD
28b10 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ir==0 ) continue
28b20 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61 74  ;.    if( osStat
28b30 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20 63  (zDir, &buf) ) c
28b40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
28b50 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74   !S_ISDIR(buf.st
28b60 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75  _mode) ) continu
28b70 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63  e;.    if( osAcc
28b80 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20  ess(zDir, 07) ) 
28b90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72  continue;.    br
28ba0 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
28bb0 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zDir;.}../*.**
28bc0 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
28bd0 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
28be0 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
28bf0 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
28c00 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
28c10 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
28c20 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
28c30 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
28c40 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
28c50 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
28c60 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
28c70 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
28c80 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
28c90 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
28ca0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43  unsigned char zC
28cb0 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
28cc0 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
28cd0 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
28ce0 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
28cf0 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
28d00 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75  0123456789";.  u
28d10 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a  nsigned int i, j
28d20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
28d30 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  zDir;..  /* It's
28d40 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
28d50 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
28d60 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
28d70 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
28d80 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
28d90 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
28da0 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
28db0 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
28dc0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
28dd0 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
28de0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
28df0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
28e00 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69  _IOERR );..  zDi
28e10 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65  r = unixTempFile
28e20 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69  Dir();.  if( zDi
28e30 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e  r==0 ) zDir = ".
28e40 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  ";..  /* Check t
28e50 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
28e60 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
28e70 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
28e80 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
28e90 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
28ea0 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
28eb0 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
28ec0 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a  .  if( (strlen(z
28ed0 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51  Dir) + strlen(SQ
28ee0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
28ef0 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20  REFIX) + 17) >= 
28f00 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a  (size_t)nBuf ){.
28f10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28f20 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
28f30 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  do{.    sqlite3_
28f40 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37  snprintf(nBuf-17
28f50 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c  , zBuf, "%s/"SQL
28f60 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
28f70 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20  EFIX, zDir);.   
28f80 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   j = (int)strlen
28f90 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
28fa0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
28fb0 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
28fc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
28fd0 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
28fe0 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
28ff0 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
29000 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
29010 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
29020 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20  s)-1) ];.    }. 
29030 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a     zBuf[j] = 0;.
29040 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65    }while( osAcce
29050 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
29060 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29070 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
29080 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
29090 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
290a0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
290b0 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
290c0 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
290d0 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
290e0 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
290f0 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
29100 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
29110 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
29120 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
29130 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
29140 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
29150 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
29160 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
29170 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
29180 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
29190 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
291a0 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
291b0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
291c0 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
291d0 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
291e0 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
291f0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
29200 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
29210 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
29220 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
29230 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
29240 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
29250 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
29260 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
29270 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
29280 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
29290 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
292a0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
292b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
292c0 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
292d0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
292e0 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
292f0 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
29300 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
29310 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
29320 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
29330 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
29340 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
29350 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
29360 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
29370 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
29380 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
29390 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
293a0 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
293b0 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
293c0 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
293d0 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
293e0 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
293f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
29400 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
29410 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
29420 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
29430 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
29440 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
29450 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
29460 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
29470 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
29480 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
29490 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
294a0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
294b0 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
294c0 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
294d0 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
294e0 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
294f0 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
29500 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
29510 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
29520 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
29530 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
29540 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
29550 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
29560 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
29570 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
29580 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
29590 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
295a0 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
295b0 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
295c0 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
295d0 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
295e0 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
295f0 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
29600 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
29610 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
29620 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
29630 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
29640 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
29650 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
29660 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
29670 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
29680 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
29690 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
296a0 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  */..  /* A stat(
296b0 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
296c0 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
296d0 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
296e0 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
296f0 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
29700 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
29710 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
29720 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
29730 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
29740 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
29750 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
29760 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
29770 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
29780 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
29790 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
297a0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
297b0 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
297c0 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
297d0 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
297e0 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
297f0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
29800 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
29810 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
29820 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
29830 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
29840 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
29850 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
29860 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
29870 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65  a resusable file
29880 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
29890 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20  not dire.  */.  
298a0 69 66 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74  if( 0==stat(zPat
298b0 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
298c0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
298d0 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e  *pInode;..    un
298e0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
298f0 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f      pInode = ino
29900 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c  deList;.    whil
29910 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49  e( pInode && (pI
29920 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76  node->fileId.dev
29930 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20  !=sStat.st_dev. 
29940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29950 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66      || pInode->f
29960 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74  ileId.ino!=sStat
29970 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20  .st_ino) ){.    
29980 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
29990 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  de->pNext;.    }
299a0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20  .    if( pInode 
299b0 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75  ){.      UnixUnu
299c0 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20  sedFd **pp;.    
299d0 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65    for(pp=&pInode
299e0 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26  ->pUnused; *pp &
299f0 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d  & (*pp)->flags!=
29a00 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70  flags; pp=&((*pp
29a10 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20  )->pNext));.    
29a20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b    pUnused = *pp;
29a30 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73  .      if( pUnus
29a40 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ed ){.        *p
29a50 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65  p = pUnused->pNe
29a60 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
29a70 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
29a80 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
29a90 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f  if    /* if !OS_
29aa0 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74  VXWORKS */.  ret
29ab0 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a  urn pUnused;.}..
29ac0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
29ad0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
29ae0 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64   unixOpen() to d
29af0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69  etermine the uni
29b00 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  x permissions.**
29b10 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66   to create new f
29b20 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f  iles with. If no
29b30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
29b40 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
29b50 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
29b60 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c   a value suitabl
29b70 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73  e for passing as
29b80 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
29b90 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69  ent to open(2) i
29ba0 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20  s.** written to 
29bb0 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f  *pMode. If an IO
29bc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
29bd0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
29be0 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
29bf0 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
29c00 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e  e of *pMode is n
29c10 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ot modified..**.
29c20 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 62  ** If the file b
29c30 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
29c40 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
29c50 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 63 72   it is always cr
29c60 65 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  eated with.** th
29c70 65 20 6f 63 74 61 6c 20 70 65 72 6d 69 73 73 69  e octal permissi
29c80 6f 6e 73 20 30 36 30 30 20 28 72 65 61 64 2f 77  ons 0600 (read/w
29c90 72 69 74 61 62 6c 65 20 62 79 20 6f 77 6e 65 72  ritable by owner
29ca0 20 6f 6e 6c 79 29 2e 20 49 66 20 74 68 65 20 66   only). If the f
29cb0 69 6c 65 0a 2a 2a 20 69 73 20 61 20 64 61 74 61  ile.** is a data
29cc0 62 61 73 65 20 6f 72 20 6d 61 73 74 65 72 20 6a  base or master j
29cd0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20  ournal file, it 
29ce0 69 73 20 63 72 65 61 74 65 64 20 77 69 74 68 20  is created with 
29cf0 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
29d00 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f  .** mask SQLITE_
29d10 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
29d20 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20  MISSIONS..**.** 
29d30 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 20  Finally, if the 
29d40 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
29d50 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65  d is a WAL or re
29d60 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
29d70 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  le, then .** thi
29d80 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69  s function queri
29d90 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  es the file-syst
29da0 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69  em for the permi
29db0 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a  ssions on the .*
29dc0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
29dd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
29de0 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f  d sets *pMode to
29df0 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65   this value. Whe
29e00 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62  never .** possib
29e10 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72  le, WAL and jour
29e20 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72  nal files are cr
29e30 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
29e40 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  same permissions
29e50 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f   .** as the asso
29e60 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
29e70 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
29e80 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
29e90 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
29ea0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
29eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
29ec0 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
29ed0 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
29ee0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
29ef0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
29f00 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
29f10 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
29f20 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
29f30 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
29f40 70 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  pMode           
29f50 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
29f60 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
29f70 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
29f80 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
29f90 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
29fa0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
29fb0 43 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 66 6c  Code */.  if( fl
29fc0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
29fd0 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
29fe0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
29ff0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
2a000 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
2a010 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
2a020 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
2a030 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a050 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
2a060 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
2a070 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
2a080 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
2a090 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2a0a0 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
2a0b0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2a0c0 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61     /* zPath is a
2a0d0 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f   path to a WAL o
2a0e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
2a0f0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2a100 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20  ock derives.    
2a110 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  ** the path to t
2a120 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
2a130 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d  tabase file from
2a140 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f   zPath. This blo
2a150 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a  ck handles.    *
2a160 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
2a170 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  naming conventio
2a180 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns:.    **.    *
2a190 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2a1a0 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a  >-journal".    *
2a1b0 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2a1c0 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  >-wal".    **   
2a1d0 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
2a1e0 75 72 6e 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20  urnal-NNNN".    
2a1f0 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2a200 62 3e 2d 77 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20  b>-wal-NNNN".   
2a210 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65   **.    ** where
2a220 20 4e 4e 4e 4e 20 69 73 20 61 20 34 20 64 69 67   NNNN is a 4 dig
2a230 69 74 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65  it decimal numbe
2a240 72 2e 20 54 68 65 20 4e 4e 4e 4e 20 6e 61 6d 69  r. The NNNN nami
2a250 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a  ng schemes are .
2a260 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74      ** used by t
2a270 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65  he test_multiple
2a280 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20  x.c module..    
2a290 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c  */.    nDb = sql
2a2a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2a2b0 74 68 29 20 2d 20 31 3b 20 0a 20 20 20 20 77 68  th) - 1; .    wh
2a2c0 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 7a 50  ile( nDb>0 && zP
2a2d0 61 74 68 5b 6e 44 62 5d 21 3d 27 6c 27 20 29 20  ath[nDb]!='l' ) 
2a2e0 6e 44 62 2d 2d 3b 0a 20 20 20 20 6e 44 62 20 2d  nDb--;.    nDb -
2a2f0 3d 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49  = ((flags & SQLI
2a300 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 3f 20 33  TE_OPEN_WAL) ? 3
2a310 20 3a 20 37 29 3b 0a 20 20 20 20 6d 65 6d 63 70   : 7);.    memcp
2a320 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44  y(zDb, zPath, nD
2a330 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d  b);.    zDb[nDb]
2a340 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66   = '\0';..    if
2a350 28 20 30 3d 3d 73 74 61 74 28 7a 44 62 2c 20 26  ( 0==stat(zDb, &
2a360 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
2a370 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73  *pMode = sStat.s
2a380 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20  t_mode & 0777;. 
2a390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a3a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2a3b0 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
2a3c0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
2a3d0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
2a3e0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a  ELETEONCLOSE ){.
2a3f0 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30      *pMode = 060
2a400 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
2a410 2a 70 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  *pMode = SQLITE_
2a420 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2a430 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20  MISSIONS;.  }.  
2a440 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a450 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
2a460 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
2a470 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
2a480 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
2a490 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
2a4a0 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
2a4b0 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
2a4c0 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
2a4d0 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
2a4e0 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
2a4f0 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
2a500 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
2a510 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
2a520 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
2a530 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
2a540 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2a550 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
2a560 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
2a570 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
2a580 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
2a590 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
2a5a0 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
2a5b0 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
2a5c0 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
2a5d0 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
2a5e0 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
2a5f0 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
2a600 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
2a610 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
2a620 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
2a630 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
2a640 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
2a650 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
2a660 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
2a670 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
2a680 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
2a690 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
2a6a0 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
2a6b0 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
2a6c0 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
2a6d0 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
2a6e0 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
2a6f0 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
2a700 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
2a710 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
2a720 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
2a730 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
2a740 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2a750 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
2a760 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
2a770 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
2a780 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
2a790 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2a7a0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
2a7b0 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
2a7c0 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
2a7d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
2a7e0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
2a7f0 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
2a800 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
2a810 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
2a820 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2a830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2a840 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
2a850 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
2a860 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
2a870 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
2a880 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
2a890 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
2a8a0 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
2a8b0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
2a8c0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
2a8d0 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
2a8e0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2a8f0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
2a900 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
2a910 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
2a920 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 20  int dirfd = -1; 
2a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a940 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65  * Directory file
2a950 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
2a960 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
2a970 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2a980 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
2a990 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   to open() */.  
2a9a0 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
2a9b0 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
2a9c0 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
2a9d0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
2a9e0 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  noLock;         
2a9f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2aa00 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69  ue to omit locki
2aa10 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f  ng primitives */
2aa20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2aa30 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2aa40 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
2aa50 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20  turn Code */..  
2aa60 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
2aa70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2aa80 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
2aa90 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
2aaa0 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
2aab0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
2aac0 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
2aad0 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
2aae0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2aaf0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
2ab00 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
2ab10 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
2ab20 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2ab30 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  NLY);.  int isRe
2ab40 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
2ab50 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2ab60 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20  READWRITE);.#if 
2ab70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2ab80 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e  CKING_STYLE.  in
2ab90 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d  t isAutoProxy  =
2aba0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2abb0 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29  _OPEN_AUTOPROXY)
2abc0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
2abd0 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73  f creating a mas
2abe0 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65  ter or main-file
2abf0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66   journal, this f
2ac00 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65  unction will ope
2ac10 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65  n.  ** a file-de
2ac20 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
2ac30 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54  directory too. T
2ac40 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e  he first time un
2ac50 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73  ixSync().  ** is
2ac60 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65   called the dire
2ac70 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
2ac80 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73  iptor will be fs
2ac90 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73  ync()ed and clos
2aca0 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  e()d..  */.  int
2acb0 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   isOpenDirectory
2acc0 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
2acd0 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
2ace0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2acf0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
2ad00 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2ad10 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2ad20 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
2ad30 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2ad40 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  _WAL.  ));..  /*
2ad50 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
2ad60 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
2ad70 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
2ad80 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
2ad90 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
2ada0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
2adb0 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
2adc0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
2add0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
2ade0 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
2adf0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
2ae00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2ae10 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
2ae20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
2ae30 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
2ae40 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
2ae50 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
2ae60 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
2ae70 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
2ae80 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
2ae90 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
2aea0 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
2aeb0 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
2aec0 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
2aed0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
2aee0 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
2aef0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
2af00 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
2af10 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
2af20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
2af30 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
2af40 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
2af50 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
2af60 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
2af70 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
2af80 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
2af90 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
2afa0 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
2afb0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
2afc0 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
2afd0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
2afe0 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
2aff0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
2b000 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
2b010 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
2b020 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
2b030 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
2b040 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
2b050 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
2b060 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
2b070 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
2b080 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
2b090 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
2b0a0 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
2b0b0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2b0c0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2b0d0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2b0e0 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
2b0f0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2b100 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2b110 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2b120 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
2b130 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
2b140 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
2b150 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
2b160 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
2b170 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
2b180 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2b190 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2b1a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2b1b0 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
2b1c0 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
2b1d0 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
2b1e0 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
2b1f0 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
2b200 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
2b210 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2b220 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
2b230 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2b240 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
2b250 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2b260 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2b270 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
2b280 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
2b290 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
2b2a0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2b2b0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
2b2c0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2b2d0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
2b2e0 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
2b2f0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2b300 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
2b310 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2b320 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
2b330 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
2b340 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
2b350 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
2b360 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2b370 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
2b380 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
2b390 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
2b3a0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
2b3b0 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
2b3c0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
2b3d0 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
2b3e0 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
2b3f0 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
2b400 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
2b410 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  oc(sizeof(*pUnus
2b420 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
2b430 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
2b440 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b450 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2b460 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55  .    }.    p->pU
2b470 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
2b480 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e  .  }else if( !zN
2b490 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ame ){.    /* If
2b4a0 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20   zName is NULL, 
2b4b0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
2b4c0 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  is requesting a 
2b4d0 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  temp file. */.  
2b4e0 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
2b4f0 65 20 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65  e && !isOpenDire
2b500 63 74 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d  ctory);.    rc =
2b510 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
2b520 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c  (MAX_PATHNAME+1,
2b530 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
2b540 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b550 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2b560 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2b570 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  zName = zTmpname
2b580 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
2b590 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20  rmine the value 
2b5a0 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  of the flags par
2b5b0 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
2b5c0 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a   POSIX function.
2b5d0 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65    ** open(). The
2b5e0 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75  se must be calcu
2b5f0 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70  lated even if op
2b600 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  en() is not call
2b610 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79  ed, as.  ** they
2b620 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
2b630 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  s part of the fi
2b640 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73  le handle and us
2b650 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20  ed by the .  ** 
2b660 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63  'conch file' loc
2b670 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c  king functions l
2b680 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69  ater on.  */.  i
2b690 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
2b6a0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2b6b0 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73  RDONLY;.  if( is
2b6c0 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e  ReadWrite ) open
2b6d0 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b  Flags |= O_RDWR;
2b6e0 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20  .  if( isCreate 
2b6f0 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  )    openFlags |
2b700 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28  = O_CREAT;.  if(
2b710 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f   isExclusive ) o
2b720 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45  penFlags |= (O_E
2b730 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b  XCL|O_NOFOLLOW);
2b740 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  .  openFlags |= 
2b750 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42  (O_LARGEFILE|O_B
2b760 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66  INARY);..  if( f
2b770 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f  d<0 ){.    mode_
2b780 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20  t openMode;     
2b790 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d           /* Perm
2b7a0 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74  issions to creat
2b7b0 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20  e file with */. 
2b7c0 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61     rc = findCrea
2b7d0 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65  teFileMode(zName
2b7e0 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f  , flags, &openMo
2b7f0 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
2b800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b810 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
2b820 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20  pUnused );.     
2b830 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
2b840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
2b850 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2b860 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2b870 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AL );.      retu
2b880 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2b890 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2b8a0 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
2b8b0 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
2b8c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
2b8d0 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f  NX   %-3d %s 0%o
2b8e0 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20  \n", fd, zName, 
2b8f0 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20  openFlags));.   
2b900 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
2b910 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73  no!=EISDIR && is
2b920 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
2b930 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
2b940 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20     /* Failed to 
2b950 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f  open the file fo
2b960 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2b970 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e  ess. Try read-on
2b980 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61  ly. */.      fla
2b990 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f  gs &= ~(SQLITE_O
2b9a0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
2b9b0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2b9c0 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  );.      openFla
2b9d0 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f  gs &= ~(O_RDWR|O
2b9e0 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66  _CREAT);.      f
2b9f0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
2ba00 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
2ba10 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
2ba20 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20   O_RDONLY;.     
2ba30 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b   isReadonly = 1;
2ba40 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75  .      fd = robu
2ba50 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
2ba60 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
2ba70 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  de);.    }.    i
2ba80 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
2ba90 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
2baa0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2bab0 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
2bac0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
2bad0 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
2bae0 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  d;.    }.  }.  a
2baf0 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a  ssert( fd>=0 );.
2bb00 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
2bb10 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  ){.    *pOutFlag
2bb20 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
2bb30 20 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64    if( p->pUnused
2bb40 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73   ){.    p->pUnus
2bb50 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20  ed->fd = fd;.   
2bb60 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61   p->pUnused->fla
2bb70 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
2bb80 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
2bb90 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
2bba0 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e  S.    zPath = zN
2bbb0 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  ame;.#else.    u
2bbc0 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65  nlink(zName);.#e
2bbd0 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c  ndif.  }.#if SQL
2bbe0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2bbf0 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b  NG_STYLE.  else{
2bc00 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  .    p->openFlag
2bc10 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
2bc20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
2bc30 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   isOpenDirectory
2bc40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
2bc50 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
2bc60 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69  , &dirfd);.    i
2bc70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2bc80 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
2bc90 69 73 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  is safe to close
2bca0 20 66 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e   fd at this poin
2bcb0 74 2c 20 62 65 63 61 75 73 65 20 69 74 20 69 73  t, because it is
2bcc0 20 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 0a   guaranteed not.
2bcd0 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f        ** to be o
2bce0 70 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61 73  pen on a databas
2bcf0 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 77 65  e file. If it we
2bd00 72 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74  re open on a dat
2bd10 61 62 61 73 65 20 66 69 6c 65 2c 0a 20 20 20 20  abase file,.    
2bd20 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64 20 6e 6f    ** it would no
2bd30 74 20 62 65 20 73 61 66 65 20 74 6f 20 63 6c 6f  t be safe to clo
2bd40 73 65 20 61 73 20 74 68 69 73 20 77 6f 75 6c 64  se as this would
2bd50 20 72 65 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63   release any loc
2bd60 6b 73 20 68 65 6c 64 0a 20 20 20 20 20 20 2a 2a  ks held.      **
2bd70 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 62 79 20   on the file by 
2bd80 74 68 69 73 20 70 72 6f 63 65 73 73 2e 20 20 2a  this process.  *
2bd90 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2bda0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2bdb0 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
2bdc0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2bdd0 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (p, fd, __LINE__
2bde0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  );.      goto op
2bdf0 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
2be00 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 46   }.  }..#ifdef F
2be10 44 5f 43 4c 4f 45 58 45 43 0a 20 20 6f 73 46 63  D_CLOEXEC.  osFc
2be20 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
2be30 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
2be40 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
2be50 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a  OEXEC);.#endif..
2be60 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65    noLock = eType
2be70 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2be80 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64  IN_DB;..  .#if d
2be90 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2bea0 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
2beb0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2bec0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
2bed0 20 66 73 49 6e 66 6f 3b 0a 20 20 69 66 28 20 66   fsInfo;.  if( f
2bee0 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e  statfs(fd, &fsIn
2bef0 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
2bf00 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
2bf10 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  le)->lastErrno =
2bf20 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
2bf30 64 69 72 66 64 3e 3d 30 20 29 20 72 6f 62 75 73  dirfd>=0 ) robus
2bf40 74 5f 63 6c 6f 73 65 28 70 2c 20 64 69 72 66 64  t_close(p, dirfd
2bf50 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2bf60 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
2bf70 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
2bf80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2bf90 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
2bfa0 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
2bfb0 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20  trncmp("msdos", 
2bfc0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2bfd0 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
2bfe0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
2bff0 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
2c000 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
2c010 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20  MSDOS;.  }.  if 
2c020 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65  (0 == strncmp("e
2c030 78 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  xfat", fsInfo.f_
2c040 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
2c050 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
2c060 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
2c070 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
2c080 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
2c090 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20  }.#endif.  .#if 
2c0a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2c0b0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20  CKING_STYLE.#if 
2c0c0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2c0d0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73  OXY_LOCKING.  is
2c0e0 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23  AutoProxy = 1;.#
2c0f0 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75  endif.  if( isAu
2c100 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74  toProxy && (zPat
2c110 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f  h!=NULL) && (!no
2c120 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78  Lock) && pVfs->x
2c130 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  Open ){.    char
2c140 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
2c150 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
2c160 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
2c170 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
2c180 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
2c190 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
2c1a0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
2c1b0 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
2c1c0 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d  s use proxy, 0 m
2c1d0 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76  eans .    ** nev
2c1e0 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
2c1f0 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
2c200 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
2c210 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f   files only.  */
2c220 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63  .    if( envforc
2c230 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e!=NULL ){.     
2c240 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69   useProxy = atoi
2c250 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20  (envforce)>0;.  
2c260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2c270 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
2c280 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nfo;.      if( s
2c290 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73  tatfs(zPath, &fs
2c2a0 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
2c2b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
2c2c0 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66  ory, the close(f
2c2d0 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f  d) call is sub-o
2c2e0 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66  ptimal. If the f
2c2f0 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20  ile opened.     
2c300 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73     ** with fd is
2c310 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2c320 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
2c330 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2c340 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
2c350 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  * on that file t
2c360 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
2c370 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f  y holding adviso
2c380 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a  ry locks on it,.
2c390 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2c3a0 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73  the call to clos
2c3b0 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20  e() will cancel 
2c3c0 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20  those locks. In 
2c3d0 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20  practice,.      
2c3e0 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d    ** we're assum
2c3f0 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28  ing that statfs(
2c400 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76  ) doesn't fail v
2c410 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65  ery often. At le
2c420 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ast.        ** n
2c430 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66  ot while other f
2c440 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2c450 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61  opened by the sa
2c460 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20  me process on.  
2c470 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d        ** the sam
2c480 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69  e file are worki
2c490 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ng.  */.        
2c4a0 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  p->lastErrno = e
2c4b0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66  rrno;.        if
2c4c0 28 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20  ( dirfd>=0 ){.  
2c4d0 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
2c4e0 6c 6f 73 65 28 70 2c 20 64 69 72 66 64 2c 20 5f  lose(p, dirfd, _
2c4f0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2c500 20 20 7d 0a 20 20 20 20 20 20 20 20 72 6f 62 75    }.        robu
2c510 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
2c520 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2c530 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2c540 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
2c550 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
2c560 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d  inished;.      }
2c570 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
2c580 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  = !(fsInfo.f_fla
2c590 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20  gs&MNT_LOCAL);. 
2c5a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
2c5b0 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
2c5c0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
2c5d0 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72  le(pVfs, fd, dir
2c5e0 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
2c5f0 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  , noLock,.      
2c600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c610 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20 69 73      isDelete, is
2c620 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 20  Readonly);.     
2c630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c640 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
2c650 20 63 61 63 68 65 20 74 68 65 20 70 4d 65 74 68   cache the pMeth
2c660 6f 64 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  od in case the t
2c670 72 61 6e 73 66 6f 72 6d 20 66 61 69 6c 73 20 2a  ransform fails *
2c680 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
2c690 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
2c6a0 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68  o_methods *pMeth
2c6b0 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  od = pFile->pMet
2c6c0 68 6f 64 73 3b 0a 20 20 20 20 20 20 20 20 72 63  hods;.        rc
2c6d0 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
2c6e0 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
2c6f0 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
2c700 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
2c710 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2c730 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
2c740 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
2c750 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
2c760 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
2c770 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
2c780 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
2c790 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
2c7a0 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
2c7b0 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
2c7c0 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
2c7d0 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
2c7e0 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
2c7f0 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
2c800 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
2c810 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2c820 20 70 4d 65 74 68 6f 64 21 3d 4e 55 4c 4c 20 29   pMethod!=NULL )
2c830 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  {.            pM
2c840 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 70 46  ethod->xClose(pF
2c850 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
2c860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2c870 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69     unixClose(pFi
2c880 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  le);.          }
2c890 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2c8a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2c8b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
2c8c0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
2c8d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2c8e0 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  if.  .  rc = fil
2c8f0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
2c900 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69  , fd, dirfd, pFi
2c910 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63  le, zPath, noLoc
2c920 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k,.             
2c930 20 20 20 20 20 20 20 20 20 69 73 44 65 6c 65 74           isDelet
2c940 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b 0a  e, isReadonly);.
2c950 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20  open_finished:. 
2c960 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c970 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2c980 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65  3_free(p->pUnuse
2c990 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
2c9a0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44   rc;.}.../*.** D
2c9b0 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61  elete the file a
2c9c0 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20  t zPath. If the 
2c9d0 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74  dirSync argument
2c9e0 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28   is true, fsync(
2c9f0 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  ).** the directo
2ca00 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e  ry after deletin
2ca10 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  g the file..*/.s
2ca20 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
2ca30 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  lete(.  sqlite3_
2ca40 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  vfs *NotUsed,   
2ca50 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e    /* VFS contain
2ca60 69 6e 67 20 74 68 69 73 20 61 73 20 74 68 65 20  ing this as the 
2ca70 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a  xDelete method *
2ca80 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2ca90 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  zPath,        /*
2caa0 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
2cab0 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20   be deleted */. 
2cac0 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20   int dirSync    
2cad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2cae0 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64   true, fsync() d
2caf0 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64  irectory after d
2cb00 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a  eleting file */.
2cb10 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2cb20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45  LITE_OK;.  UNUSE
2cb30 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2cb40 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  sed);.  Simulate
2cb50 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
2cb60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
2cb70 54 45 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e  TE);.  if( unlin
2cb80 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 26  k(zPath)==(-1) &
2cb90 26 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20  & errno!=ENOENT 
2cba0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  ){.    return un
2cbb0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2cbc0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
2cbd0 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29  "unlink", zPath)
2cbe0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
2cbf0 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52  LITE_DISABLE_DIR
2cc00 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79  SYNC.  if( dirSy
2cc10 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64  nc ){.    int fd
2cc20 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44  ;.    rc = openD
2cc30 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20  irectory(zPath, 
2cc40 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &fd);.    if( rc
2cc50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
2cc60 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2cc70 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
2cc80 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20  )==-1 ).#else.  
2cc90 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
2cca0 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ) ).#endif.     
2ccb0 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
2ccc0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2ccd0 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
2cce0 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50  YNC, "fsync", zP
2ccf0 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
2cd00 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2cd10 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
2cd20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
2cd30 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
2cd40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  .}../*.** Test t
2cd50 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
2cd60 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  or access permis
2cd70 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50  sions of file zP
2cd80 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74  ath. The.** test
2cd90 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e   performed depen
2cda0 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
2cdb0 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
2cdc0 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
2cdd0 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e  S_EXISTS: Return
2cde0 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65   1 if the file e
2cdf0 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c  xists.**     SQL
2ce00 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
2ce10 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69  RITE: Return 1 i
2ce20 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
2ce30 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e  ad and writable.
2ce40 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
2ce50 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20  CCESS_READONLY: 
2ce60 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
2ce70 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65  file is readable
2ce80 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
2ce90 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  e return 0..*/.s
2cea0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63  tatic int unixAc
2ceb0 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
2cec0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  vfs *NotUsed,   
2ced0 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61  /* The VFS conta
2cee0 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65  ining this xAcce
2cef0 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  ss method */.  c
2cf00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2cf10 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f  ,      /* Path o
2cf20 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78  f the file to ex
2cf30 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66  amine */.  int f
2cf40 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2cf50 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65     /* What do we
2cf60 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61   want to learn a
2cf70 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66  bout the zPath f
2cf80 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ile? */.  int *p
2cf90 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
2cfa0 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
2cfb0 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a  t boolean here *
2cfc0 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65  /.){.  int amode
2cfd0 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50   = 0;.  UNUSED_P
2cfe0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2cff0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
2d000 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
2d010 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
2d020 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ; );.  switch( f
2d030 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
2d040 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2d050 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f  XISTS:.      amo
2d060 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20  de = F_OK;.     
2d070 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2d080 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
2d090 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
2d0a0 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f  amode = W_OK|R_O
2d0b0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
2d0c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2d0d0 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
2d0e0 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b     amode = R_OK;
2d0f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
2d100 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2d110 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
2d120 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
2d130 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
2d140 4f 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28  Out = (osAccess(
2d150 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30  zPath, amode)==0
2d160 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d  );.  if( flags==
2d170 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2d180 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74  ISTS && *pResOut
2d190 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
2d1a0 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28  tat buf;.    if(
2d1b0 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c 20   0==stat(zPath, 
2d1c0 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f  &buf) && buf.st_
2d1d0 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  size==0 ){.     
2d1e0 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20   *pResOut = 0;. 
2d1f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2d200 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2d210 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
2d220 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
2d230 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
2d240 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69  name. The relati
2d250 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74  ve path.** is st
2d260 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65  ored as a nul-te
2d270 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
2d280 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
2d290 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a  inted to by.** z
2d2a0 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75  Path. .**.** zOu
2d2b0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  t points to a bu
2d2c0 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
2d2d0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
2d2e0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a  athname bytes .*
2d2f0 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c  * (in this case,
2d300 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79   MAX_PATHNAME by
2d310 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70  tes). The full-p
2d320 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74  ath is written t
2d330 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  o.** this buffer
2d340 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2d350 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2d360 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
2d370 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
2d380 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
2d390 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2d3a0 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
2d3b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2d3c0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
2d3d0 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
2d3e0 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
2d3f0 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20  /.  int nOut,   
2d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d410 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
2d420 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
2d430 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
2d440 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
2d450 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
2d460 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20   buffer */.){.. 
2d470 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
2d480 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
2d490 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
2d4a0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
2d4b0 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
2d4c0 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
2d4d0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
2d4e0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
2d4f0 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
2d500 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
2d510 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2d520 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
2d530 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
2d540 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
2d550 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
2d560 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
2d570 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
2d580 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
2d590 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
2d5a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ..  assert( pVfs
2d5b0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41  ->mxPathname==MA
2d5c0 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20  X_PATHNAME );.  
2d5d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2d5e0 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b  (pVfs);..  zOut[
2d5f0 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a  nOut-1] = '\0';.
2d600 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d    if( zPath[0]==
2d610 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '/' ){.    sqlit
2d620 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
2d630 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50  , zOut, "%s", zP
2d640 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
2d650 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20     int nCwd;.   
2d660 20 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f   if( osGetcwd(zO
2d670 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29  ut, nOut-1)==0 )
2d680 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75  {.      return u
2d690 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
2d6a0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2d6b0 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74  , "getcwd", zPat
2d6c0 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  h);.    }.    nC
2d6d0 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  wd = (int)strlen
2d6e0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  (zOut);.    sqli
2d6f0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
2d700 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43  t-nCwd, &zOut[nC
2d710 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74  wd], "/%s", zPat
2d720 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  h);.  }.  return
2d730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
2d740 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d750 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
2d760 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
2d770 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
2d780 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
2d790 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
2d7a0 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
2d7b0 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2d7c0 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
2d7d0 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2d7e0 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ary..*/.#include
2d7f0 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69   <dlfcn.h>.stati
2d800 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70  c void *unixDlOp
2d810 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
2d820 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63  NotUsed, const c
2d830 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
2d840 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d850 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2d860 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46  return dlopen(zF
2d870 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f  ilename, RTLD_NO
2d880 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29  W | RTLD_GLOBAL)
2d890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74  ;.}../*.** SQLit
2d8a0 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
2d8b0 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c  ction immediatel
2d8c0 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  y after a call t
2d8d0 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72  o unixDlSym() or
2d8e0 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29  .** unixDlOpen()
2d8f0 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20   fails (returns 
2d900 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e  a null pointer).
2d910 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69   If a more detai
2d920 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73  led error.** mes
2d930 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c  sage is availabl
2d940 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  e, it is written
2d950 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20   to zBufOut. If 
2d960 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  no error message
2d970 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
2d980 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66  , zBufOut is lef
2d990 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64  t unmodified and
2d9a0 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64   SQLite uses a d
2d9b0 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20  efault.** error 
2d9c0 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  message..*/.stat
2d9d0 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72  ic void unixDlEr
2d9e0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
2d9f0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42  *NotUsed, int nB
2da00 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
2da10 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
2da20 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44   *zErr;.  UNUSED
2da30 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2da40 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  ed);.  unixEnter
2da50 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20  Mutex();.  zErr 
2da60 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69  = dlerror();.  i
2da70 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73  f( zErr ){.    s
2da80 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2da90 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22  nBuf, zBufOut, "
2daa0 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a  %s", zErr);.  }.
2dab0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2dac0 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ();.}.static voi
2dad0 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71  d (*unixDlSym(sq
2dae0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2daf0 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e  ed, void *p, con
2db00 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76  st char*zSym))(v
2db10 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a  oid){.  /* .  **
2db20 20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e   GCC with -pedan
2db30 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20  tic-errors says 
2db40 74 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f  that C90 does no
2db50 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20  t allow a void* 
2db60 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20  to be.  ** cast 
2db70 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
2db80 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41  o a function.  A
2db90 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62 72 61  nd yet the libra
2dba0 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69  ry dlsym() routi
2dbb0 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  ne.  ** returns 
2dbc0 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73  a void* which is
2dbd0 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65   really a pointe
2dbe0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
2dbf0 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20    So how do we. 
2dc00 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20   ** use dlsym() 
2dc10 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
2dc20 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  rrors?.  **.  **
2dc30 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f   Variable x belo
2dc40 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  w is defined to 
2dc50 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
2dc60 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e  a function takin
2dc70 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72  g.  ** parameter
2dc80 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73  s void* and cons
2dc90 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75  t char* and retu
2dca0 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20  rning a pointer 
2dcb0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  to a function.. 
2dcc0 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a   ** We initializ
2dcd0 65 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67  e x by assigning
2dce0 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   it a pointer to
2dcf0 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e   the dlsym() fun
2dd00 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61  ction..  ** (Tha
2dd10 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71  t assignment req
2dd20 75 69 72 65 73 20 61 20 63 61 73 74 2e 29 20 20  uires a cast.)  
2dd30 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65  Then we call the
2dd40 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20   function that. 
2dd50 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e   ** x points to.
2dd60 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
2dd70 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73  s work-around is
2dd80 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72   unlikely to wor
2dd90 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61  k correctly on a
2dda0 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a  ny system where.
2ddb0 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20    ** you really 
2ddc0 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75  cannot cast a fu
2ddd0 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
2dde0 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20  nto void*.  But 
2ddf0 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a  then, on the.  *
2de00 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c  * other hand, dl
2de10 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77  sym() will not w
2de20 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79  ork on such a sy
2de30 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20  stem either, so 
2de40 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74  we have.  ** not
2de50 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79   really lost any
2de60 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f  thing..  */.  vo
2de70 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c  id (*(*x)(void*,
2de80 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f  const char*))(vo
2de90 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  id);.  UNUSED_PA
2dea0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2deb0 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28  ;.  x = (void(*(
2dec0 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  *)(void*,const c
2ded0 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73  har*))(void))dls
2dee0 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78  ym;.  return (*x
2def0 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74  )(p, zSym);.}.st
2df00 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
2df10 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
2df20 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64  s *NotUsed, void
2df30 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
2df40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2df50 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f  otUsed);.  dlclo
2df60 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  se(pHandle);.}.#
2df70 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
2df80 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
2df90 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
2dfa0 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75  : */.  #define u
2dfb0 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  nixDlOpen  0.  #
2dfc0 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72  define unixDlErr
2dfd0 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  or 0.  #define u
2dfe0 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  nixDlSym   0.  #
2dff0 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f  define unixDlClo
2e000 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  se 0.#endif../*.
2e010 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79  ** Write nBuf by
2e020 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61  tes of random da
2e030 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ta to the suppli
2e040 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  ed buffer zBuf..
2e050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2e060 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  ixRandomness(sql
2e070 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2e080 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
2e090 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53  r *zBuf){.  UNUS
2e0a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2e0b0 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28  Used);.  assert(
2e0c0 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73  (size_t)nBuf>=(s
2e0d0 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69  izeof(time_t)+si
2e0e0 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20  zeof(int)));..  
2e0f0 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  /* We have to in
2e100 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f  itialize zBuf to
2e110 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e   prevent valgrin
2e120 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67  d from reporting
2e130 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54  .  ** errors.  T
2e140 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65  he reports issue
2e150 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72  d by valgrind ar
2e160 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65  e incorrect - we
2e170 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66   would.  ** pref
2e180 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64  er that the rand
2e190 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61  omness be increa
2e1a0 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  sed by making us
2e1b0 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e of the.  ** un
2e1c0 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
2e1d0 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20  e in zBuf - but 
2e1e0 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20  valgrind errors 
2e1f0 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20  tend to worry.  
2e200 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20  ** some users.  
2e210 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75  Rather than argu
2e220 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69  e, it seems easi
2e230 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69  er just to initi
2e240 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77  alize.  ** the w
2e250 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73  hole array and s
2e260 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c  ilence valgrind,
2e270 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
2e280 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e  ans less randomn
2e290 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ess.  ** in the 
2e2a0 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a  random seed..  *
2e2b0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74  *.  ** When test
2e2c0 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ing, initializin
2e2d0 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f  g zBuf[] to zero
2e2e0 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20   is all we do.  
2e2f0 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  That means.  ** 
2e300 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75  that we always u
2e310 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64  se the same rand
2e320 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e  om number sequen
2e330 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20  ce.  This makes 
2e340 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72  the.  ** tests r
2e350 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  epeatable..  */.
2e360 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
2e370 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65  , nBuf);.#if !de
2e380 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
2e390 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70  T).  {.    int p
2e3a0 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d  id, fd;.    fd =
2e3b0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64   robust_open("/d
2e3c0 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52  ev/urandom", O_R
2e3d0 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69  DONLY, 0);.    i
2e3e0 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
2e3f0 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20   time_t t;.     
2e400 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20   time(&t);.     
2e410 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74   memcpy(zBuf, &t
2e420 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20  , sizeof(t));.  
2e430 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64      pid = getpid
2e440 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ();.      memcpy
2e450 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29  (&zBuf[sizeof(t)
2e460 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
2e470 70 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73  pid));.      ass
2e480 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73  ert( sizeof(t)+s
2e490 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a  izeof(pid)<=(siz
2e4a0 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  e_t)nBuf );.    
2e4b0 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28    nBuf = sizeof(
2e4c0 74 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29  t) + sizeof(pid)
2e4d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e4e0 20 20 20 64 6f 7b 20 6e 42 75 66 20 3d 20 6f 73     do{ nBuf = os
2e4f0 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e  Read(fd, zBuf, n
2e500 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 6e 42  Buf); }while( nB
2e510 75 66 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  uf<0 && errno==E
2e520 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f  INTR );.      ro
2e530 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
2e540 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2e550 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
2e560 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a  return nBuf;.}..
2e570 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
2e580 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
2e590 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
2e5a0 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
2e5b0 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  t..** The argume
2e5c0 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  nt is the number
2e5d0 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
2e5e0 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65   we want to slee
2e5f0 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  p..** The return
2e600 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
2e610 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
2e620 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63  onds of sleep ac
2e630 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73  tually.** reques
2e640 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64  ted from the und
2e650 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e  erlying operatin
2e660 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62  g system, a numb
2e670 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68  er which.** migh
2e680 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
2e690 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
2e6a0 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20  e argument, but 
2e6b0 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e  not less.** than
2e6c0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   the argument..*
2e6d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2e6e0 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  xSleep(sqlite3_v
2e6f0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
2e700 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a   microseconds){.
2e710 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2e720 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
2e730 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65   sp;..  sp.tv_se
2e740 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  c = microseconds
2e750 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70   / 1000000;.  sp
2e760 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72  .tv_nsec = (micr
2e770 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30  oseconds % 10000
2e780 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61  00) * 1000;.  na
2e790 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c  nosleep(&sp, NUL
2e7a0 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  L);.  UNUSED_PAR
2e7b0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2e7c0 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73  .  return micros
2e7d0 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65  econds;.#elif de
2e7e0 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45  fined(HAVE_USLEE
2e7f0 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45  P) && HAVE_USLEE
2e800 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f  P.  usleep(micro
2e810 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
2e820 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2e830 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
2e840 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
2e850 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64  lse.  int second
2e860 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  s = (microsecond
2e870 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30  s+999999)/100000
2e880 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e  0;.  sleep(secon
2e890 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ds);.  UNUSED_PA
2e8a0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2e8b0 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e  ;.  return secon
2e8c0 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64  ds*1000000;.#end
2e8d0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  if.}../*.** The 
2e8e0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
2e8f0 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
2e900 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
2e910 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
2e920 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
2e930 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
2e940 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65   1970 and is use
2e950 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73  d to set the res
2e960 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ult of.** sqlite
2e970 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
2e980 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e   during testing.
2e990 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
2e9a0 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
2e9b0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2e9c0 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79  = 0;  /* Fake sy
2e9d0 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63  stem time in sec
2e9e0 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
2e9f0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
2ea00 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
2ea10 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
2ea20 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
2ea30 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
2ea40 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74  into *piNow.** t
2ea50 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
2ea60 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
2ea70 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
2ea80 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30  times 86_400_000
2ea90 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77  .  In.** other w
2eaa0 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f  ords, write into
2eab0 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62   *piNow the numb
2eac0 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
2ead0 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c  ds since the Jul
2eae0 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20  ian.** epoch of 
2eaf0 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63  noon in Greenwic
2eb00 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34  h on November 24
2eb10 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72  , 4714 B.C accor
2eb20 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70  ding to the.** p
2eb30 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69  roleptic Gregori
2eb40 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a  an calendar..**.
2eb50 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
2eb60 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
2eb70 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
2eb80 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
2eb90 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
2eba0 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
2ebb0 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
2ebc0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2ebd0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
2ebe0 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69  *piNow){.  stati
2ebf0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2ec00 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
2ec10 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
2ec20 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
2ec30 30 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  0;.#if defined(N
2ec40 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65  O_GETTOD).  time
2ec50 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29  _t t;.  time(&t)
2ec60 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73  ;.  *piNow = ((s
2ec70 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a  qlite3_int64)t)*
2ec80 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68  1000 + unixEpoch
2ec90 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52  ;.#elif OS_VXWOR
2eca0 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  KS.  struct time
2ecb0 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f  spec sNow;.  clo
2ecc0 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b  ck_gettime(CLOCK
2ecd0 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77  _REALTIME, &sNow
2ece0 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e  );.  *piNow = un
2ecf0 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28  ixEpoch + 1000*(
2ed00 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e  sqlite3_int64)sN
2ed10 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77  ow.tv_sec + sNow
2ed20 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30  .tv_nsec/1000000
2ed30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
2ed40 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20   timeval sNow;. 
2ed50 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73   gettimeofday(&s
2ed60 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 69 4e 6f  Now, 0);.  *piNo
2ed70 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
2ed80 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2ed90 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
2eda0 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31  + sNow.tv_usec/1
2edb0 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  000;.#endif..#if
2edc0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2edd0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
2ede0 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
2edf0 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a    *piNow = 1000*
2ee00 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
2ee10 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2ee20 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  ime + unixEpoch;
2ee30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e  .  }.#endif.  UN
2ee40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2ee50 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
2ee60 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  n 0;.}../*.** Fi
2ee70 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2ee80 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
2ee90 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
2eea0 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
2eeb0 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
2eec0 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
2eed0 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
2eee0 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
2eef0 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
2ef00 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
2ef10 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
2ef20 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
2ef30 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
2ef40 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
2ef50 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2ef60 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
2ef70 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2ef80 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   i;.  UNUSED_PAR
2ef90 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2efa0 0a 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  .  unixCurrentTi
2efb0 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a  meInt64(0, &i);.
2efc0 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34    *prNow = i/864
2efd0 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72  00000.0;.  retur
2efe0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65  n 0;.}../*.** We
2eff0 20 61 64 64 65 64 20 74 68 65 20 78 47 65 74 4c   added the xGetL
2f000 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f  astError() metho
2f010 64 20 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e  d with the inten
2f020 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e  tion of providin
2f030 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d  g.** better low-
2f040 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73  level error mess
2f050 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74  ages when operat
2f060 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c  ing-system probl
2f070 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64  ems come up.** d
2f080 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65  uring SQLite ope
2f090 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20  ration.  But so 
2f0a0 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61  far, none of tha
2f0b0 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65  t has been imple
2f0c0 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65  mented.** in the
2f0d0 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20   core.  So this 
2f0e0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
2f0f0 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f   called.  For no
2f100 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a  w, it is merely.
2f110 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65  ** a place-holde
2f120 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2f130 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f   unixGetLastErro
2f140 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  r(sqlite3_vfs *N
2f150 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
2f160 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55  sed2, char *NotU
2f170 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed3){.  UNUSED_
2f180 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2f190 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
2f1a0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29  AMETER(NotUsed2)
2f1b0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2f1c0 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a  ETER(NotUsed3);.
2f1d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
2f1e0 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
2f1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
2f200 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  of sqlite3_vfs m
2f210 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
2f220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f230 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2f240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f280 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
2f290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f2d0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
2f2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
2f2f0 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69  egin Proxy Locki
2f300 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
2f310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f320 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ***.**.** Proxy 
2f330 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62  locking is a "ub
2f340 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f  er-locking-metho
2f350 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65  d" in this sense
2f360 3a 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a  :  It uses the.*
2f370 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  * other locking 
2f380 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e  methods on secon
2f390 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e  dary lock files.
2f3a0 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20    Proxy locking 
2f3b0 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79  is a.** meta-lay
2f3c0 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74  er over top of t
2f3d0 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
2f3e0 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64  king implemented
2f3f0 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20   above.  For.** 
2f400 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
2f410 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
2f420 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f  mplements of pro
2f430 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65  xy locking is de
2f440 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20  ferred.** until 
2f450 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65  late in the file
2f460 20 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c   (here) after al
2f470 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49  l of the other I
2f480 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a  /O methods have.
2f490 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20  ** been defined 
2f4a0 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72  - so that the pr
2f4b0 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
2f4c0 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69  methods are avai
2f4d0 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76  lable.** as serv
2f4e0 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74  ices to help wit
2f4f0 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  h the implementa
2f500 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f  tion of proxy lo
2f510 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a  cking..**.****.*
2f520 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
2f530 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
2f540 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62   in SQLite use b
2f550 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
2f560 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
2f570 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64  se file to coord
2f580 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63  inate safe, conc
2f590 75 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79  urrent access by
2f5a0 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
2f5b0 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73  s.** and writers
2f5c0 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e   [http://sqlite.
2f5d0 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74  org/lockingv3.ht
2f5e0 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66  ml].  The five f
2f5f0 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  ile locking.** s
2f600 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c  tates (UNLOCKED,
2f610 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44   PENDING, SHARED
2f620 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c  , RESERVED, EXCL
2f630 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65  USIVE) are imple
2f640 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53  mented.** as POS
2f650 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20  IX read & write 
2f660 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64  locks over fixed
2f670 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e   set of location
2f680 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a  s (via fsctl),.*
2f690 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42  * on AFP and SMB
2f6a0 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20   only exclusive 
2f6b0 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
2f6c0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76   are available v
2f6d0 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68  ia fsctl.** with
2f6e0 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
2f6f0 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
2f700 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63  LockPB2) to trac
2f710 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61  k the same 5 sta
2f720 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c  tes..** To simul
2f730 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e  ate a F_RDLCK on
2f740 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
2f750 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64  e, on AFP a rand
2f760 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a  omly selected.**
2f770 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20   address in the 
2f780 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
2f790 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52  taken for a SHAR
2f7a0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74  ED lock, the ent
2f7b0 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61  ire.** shared ra
2f7c0 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
2f7d0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
2f7e0 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ck):.**.**      
2f7f0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20  PENDING_BYTE    
2f800 20 20 20 20 30 78 34 30 30 30 30 30 30 30 09 09      0x40000000..
2f810 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53     ..**      RES
2f820 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20  ERVED_BYTE      
2f830 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20   0x40000001.**  
2f840 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45      SHARED_RANGE
2f850 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
2f860 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30  02 -> 0x40000200
2f870 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
2f880 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f  s well on the lo
2f890 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  cal file system,
2f8a0 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61   but shows a nea
2f8b0 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77  rly 100x.** slow
2f8c0 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72  down in read per
2f8d0 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20  formance on AFP 
2f8e0 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20  because the AFP 
2f8f0 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a  client disables.
2f900 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68  ** the read cach
2f910 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67  e when byte-rang
2f920 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73  e locks are pres
2f930 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74  ent.  Enabling t
2f940 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65  he read.** cache
2f950 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65   exposes a cache
2f960 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c   coherency probl
2f970 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65  em that is prese
2f980 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a  nt on all OS X.*
2f990 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77  * supported netw
2f9a0 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73  ork file systems
2f9b0 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62  .  NFS and AFP b
2f9c0 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a  oth observe the.
2f9d0 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e  ** close-to-open
2f9e0 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65   semantics for e
2f9f0 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f  nsuring cache co
2fa00 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70  herency.** [http
2fa10 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72  ://nfs.sourcefor
2fa20 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c  ge.net/#faq_a8],
2fa30 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
2fa40 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61  effectively.** a
2fa50 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69  ddress the requi
2fa60 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63  rements for conc
2fa70 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
2fa80 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
2fa90 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e  le.** readers an
2faa0 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74  d writers.** [ht
2fab0 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e  tp://www.nabble.
2fac0 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46  com/SQLite-on-NF
2fad0 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63  S-cache-coherenc
2fae0 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d  y-td15655701.htm
2faf0 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64  l]..**.** To add
2fb00 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d  ress the perform
2fb10 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63  ance and cache c
2fb20 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c  oherency issues,
2fb30 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   proxy file lock
2fb40 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
2fb50 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20  he way database 
2fb60 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f  access is contro
2fb70 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67  lled by limiting
2fb80 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20   access to a.** 
2fb90 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61  single host at a
2fba0 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67   time and moving
2fbb0 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20   file locks off 
2fbc0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2fbd0 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f  file.** and onto
2fbe0 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e   a proxy file on
2fbf0 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
2fc00 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a  system.  .**.**.
2fc10 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c  ** Using proxy l
2fc20 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ocks.** --------
2fc30 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
2fc40 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71  C APIs.**.**  sq
2fc50 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
2fc60 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
2fc70 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
2fc80 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
2fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fca0 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c    <proxy_path> |
2fcb0 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20   ":auto:");.**  
2fcc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
2fcd0 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
2fce0 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
2fcf0 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f  PROXYFILE, &<pro
2fd00 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a  xy_path>);.**.**
2fd10 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a  .** SQL pragmas.
2fd20 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  **.**  PRAGMA [d
2fd30 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
2fd40 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f  oxy_file=<proxy_
2fd50 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a  path> | :auto:.*
2fd60 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
2fd70 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
2fd80 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  file.**.** Speci
2fd90 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d  fying ":auto:" m
2fda0 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65  eans that if the
2fdb0 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69  re is a conch fi
2fdc0 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69  le with a matchi
2fdd0 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e  ng.** host ID in
2fde0 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70   it, the proxy p
2fdf0 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
2fe00 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
2fe10 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a  ed, otherwise.**
2fe20 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61   a proxy path ba
2fe30 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27  sed on the user'
2fe40 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76  s temp dir.** (v
2fe50 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44  ia confstr(_CS_D
2fe60 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
2fe70 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62  DIR,...)) will b
2fe80 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
2fe90 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66  * actual proxy f
2fea0 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65  ile name is gene
2feb0 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e  rated from the n
2fec0 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20  ame and path of 
2fed0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2fee0 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  file.  For examp
2fef0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
2ff00 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74  For database pat
2ff10 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f  h "/Users/me/foo
2ff20 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54  .db" .**       T
2ff30 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c  he lock path wil
2ff40 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73  l be "<tmpdir>/s
2ff50 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65  qliteplocks/_Use
2ff60 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74  rs_me_foo.db:aut
2ff70 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  o:").**.** Once 
2ff80 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20  a lock proxy is 
2ff90 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61  configured for a
2ffa0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2ffb0 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74  tion, it can not
2ffc0 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20  .** be removed, 
2ffd0 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62  however it may b
2ffe0 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20  e switched to a 
2fff0 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20  different proxy 
30000 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20  path via.** the 
30010 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75  above APIs (assu
30020 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66  ming the conch f
30030 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ile is not being
30040 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
30050 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  .** connection o
30060 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a  r process). .**.
30070 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20  **.** How proxy 
30080 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a  locking works.**
30090 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
300a0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50  --------.**.** P
300b0 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
300c0 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69  g relies primari
300d0 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75  ly on two new su
300e0 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20  pporting files: 
300f0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63  .**.**   *  conc
30100 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20  h file to limit 
30110 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61  access to the da
30120 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61  tabase file to a
30130 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20   single host.** 
30140 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a       at a time.*
30150 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20  *.**   *  proxy 
30160 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61  file to act as a
30170 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61   proxy for the a
30180 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f  dvisory locks no
30190 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74  rmally.**      t
301a0 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
301b0 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  base.**.** The c
301c0 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75  onch file - to u
301d0 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c  se a proxy file,
301e0 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72   sqlite must fir
301f0 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e  st "hold the con
30200 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67  ch".** by taking
30210 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65   an sqlite-style
30220 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
30230 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  the conch file, 
30240 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63  reading the.** c
30250 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70  ontents and comp
30260 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73  aring the host's
30270 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20   unique host ID 
30280 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20  (see below) and 
30290 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61  lock.** proxy pa
302a0 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76  th against the v
302b0 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
302c0 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20  the conch.  The 
302d0 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a  conch file is.**
302e0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
302f0 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
30300 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30310 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
30320 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65  name.** is patte
30330 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64  rned after the d
30340 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
30350 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65  e as ".<database
30360 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a  name>-conch"..**
30370 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   If the conch fi
30380 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
30390 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65  t, or it's conte
303a0 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
303b0 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20   the.** host ID 
303c0 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74  and/or proxy pat
303d0 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  h, then the lock
303e0 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f   is escalated to
303f0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a   an exclusive.**
30400 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f   lock and the co
30410 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  nch file content
30420 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  s is updated wit
30430 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  h the host ID an
30440 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20  d proxy.** path 
30450 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  and the lock is 
30460 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
30470 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69  shared lock agai
30480 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68  n.  If the conch
30490 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61  .** is held by a
304a0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28  nother process (
304b0 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f  with a shared lo
304c0 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69  ck), the exclusi
304d0 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20  ve lock.** will 
304e0 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f  fail and SQLITE_
304f0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
30500 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ..**.** The prox
30510 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c  y file - a singl
30520 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64  e-byte file used
30530 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72   for all advisor
30540 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20  y file locks.** 
30550 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f  normally taken o
30560 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30570 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f  ile.   This allo
30580 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72  ws for safe shar
30590 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ing.** of the da
305a0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
305b0 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
305c0 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20   and writers on 
305d0 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74  the same.** host
305e0 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75   (the conch ensu
305f0 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c  res that they al
30600 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c  l use the same l
30610 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e  ocal lock file).
30620 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e  .**.** Requestin
30630 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79  g the lock proxy
30640 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69   does not immedi
30650 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63  ately take the c
30660 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f  onch, it is.** o
30670 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74  nly taken when t
30680 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74  he first request
30690 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73   to lock databas
306a0 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20  e file is made. 
306b0 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65   .** This matche
306c0 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20  s the semantics 
306d0 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e  of the tradition
306e0 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76  al locking behav
306f0 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70  ior, where.** op
30700 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69  ening a connecti
30710 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  on to a database
30720 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74   file does not t
30730 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74  ake a lock on it
30740 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20  ..** The shared 
30750 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e  lock and an open
30760 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
30770 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20   are maintained 
30780 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f  until .** the co
30790 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
307a0 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73  database is clos
307b0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ed. .**.** The p
307c0 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68  roxy file and th
307d0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20  e lock file are 
307e0 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f  never deleted so
307f0 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a   they only need.
30800 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ** to be created
30810 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
30820 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a  they are used..*
30830 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
30840 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d  on options.** --
30850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30860 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ---.**.**  SQLIT
30870 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
30880 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  OCKING.**.**    
30890 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
308a0 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f  s accessed on no
308b0 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  n-local file sys
308c0 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  tems are.**     
308d0 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20    automatically 
308e0 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70  configured for p
308f0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f  roxy locking, lo
30900 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20  ck files are.** 
30910 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f        named auto
30920 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20  matically using 
30930 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61  the same logic a
30940 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d  s.**       PRAGM
30950 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  A lock_proxy_fil
30960 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20  e=":auto:".**   
30970 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f   .**  SQLITE_PRO
30980 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20  XY_DEBUG.**.**  
30990 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65       Enables the
309a0 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f   logging of erro
309b0 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e  r messages durin
309c0 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a  g host id file.*
309d0 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61  *       retrieva
309e0 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a  l and creation.*
309f0 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44  *.**  LOCKPROXYD
30a00 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f  IR.**.**       O
30a10 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66  verrides the def
30a20 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75  ault directory u
30a30 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f  sed for lock pro
30a40 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a  xy files that.**
30a50 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64         are named
30a60 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76   automatically v
30a70 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20  ia the ":auto:" 
30a80 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53  setting.**.**  S
30a90 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
30aa0 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
30ab0 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50  NS.**.**       P
30ac0 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73  ermissions to us
30ad0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
30ae0 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  a directory for 
30af0 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20  storing the.**  
30b00 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20       lock proxy 
30b10 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64  files, only used
30b20 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44   when LOCKPROXYD
30b30 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a  IR is not set..*
30b40 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20  *    .**    .** 
30b50 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f  As mentioned abo
30b60 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ve, when compile
30b70 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52  d with SQLITE_PR
30b80 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
30b90 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74  NG,.** setting t
30ba0 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  he environment v
30bb0 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46  ariable SQLITE_F
30bc0 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
30bd0 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20  NG to 1 will.** 
30be0 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b  force proxy lock
30bf0 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66  ing to be used f
30c00 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73  or every databas
30c10 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61  e file opened, a
30c20 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72  nd 0.** will for
30c30 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f  ce automatic pro
30c40 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
30c50 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c   disabled for al
30c60 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
30c70 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63  les (explicity c
30c80 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54  alling the SQLIT
30c90 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
30ca0 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a  ILE pragma or.**
30cb0 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e   sqlite_file_con
30cc0 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20  trol API is not 
30cd0 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49  affected by SQLI
30ce0 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
30cf0 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a  OCKING)..*/../*.
30d00 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
30d10 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
30d20 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f  le on MacOSX .*/
30d30 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
30d40 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
30d50 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
30d60 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68  _STYLE../*.** Th
30d70 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  e proxyLockingCo
30d80 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61  ntext has the pa
30d90 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75  th and file stru
30da0 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72  ctures for the r
30db0 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f  emote .** and lo
30dc0 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20  cal proxy files 
30dd0 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66  in it.*/.typedef
30de0 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63   struct proxyLoc
30df0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78  kingContext prox
30e00 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  yLockingContext;
30e10 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63  .struct proxyLoc
30e20 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
30e30 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
30e40 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ile;         /* 
30e50 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20  Open conch file 
30e60 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
30e70 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20  FilePath;       
30e80 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
30e90 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
30ea0 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
30eb0 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  roxy;         /*
30ec0 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b   Open proxy lock
30ed0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
30ee0 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20  *lockProxyPath; 
30ef0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
30f00 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
30f10 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
30f20 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
30f30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
30f40 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
30f50 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68  e */.  int conch
30f60 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  Held;           
30f70 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20      /* 1 if the 
30f80 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d  conch is held, -
30f90 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  1 if lockless */
30fa0 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b  .  void *oldLock
30fb0 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20  ingContext;     
30fc0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b  /* Original lock
30fd0 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65  ingcontext to re
30fe0 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a  store on close *
30ff0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  /.  sqlite3_io_m
31000 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f  ethods const *pO
31010 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a  ldMethod;     /*
31020 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65   Original I/O me
31030 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20  thods for close 
31040 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
31050 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  e proxy lock fil
31060 65 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64  e path for the d
31070 61 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74  atabase at dbPat
31080 68 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  h is written int
31090 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69  o lPath, .** whi
310a0 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ch must point to
310b0 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65   valid, writable
310c0 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e   memory large en
310d0 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65  ough for a maxLe
310e0 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65  n length.** file
310f0 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69   path. .*/.stati
31100 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f  c int proxyGetLo
31110 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
31120 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20  r *dbPath, char 
31130 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d  *lPath, size_t m
31140 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65  axLen){.  int le
31150 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a  n;.  int dbLen;.
31160 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66    int i;..#ifdef
31170 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20   LOCKPROXYDIR.  
31180 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
31190 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49  ath, LOCKPROXYDI
311a0 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73  R, maxLen);.#els
311b0 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41  e.# ifdef _CS_DA
311c0 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
311d0 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21  IR.  {.    if( !
311e0 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
311f0 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
31200 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29  , lPath, maxLen)
31210 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
31220 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E(("GETLOCKPATH 
31230 20 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f   failed %s errno
31240 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%d pid=%d\n",. 
31250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50                lP
31260 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70  ath, errno, getp
31270 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65  id()));.      re
31280 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
31290 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  R_LOCK;.    }.  
312a0 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28    len = strlcat(
312b0 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c  lPath, "sqlitepl
312c0 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20  ocks", maxLen); 
312d0 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20     .  }.# else. 
312e0 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c   len = strlcpy(l
312f0 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d  Path, "/tmp/", m
31300 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a  axLen);.# endif.
31310 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50  #endif..  if( lP
31320 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20  ath[len-1]!='/' 
31330 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  ){.    len = str
31340 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c  lcat(lPath, "/",
31350 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20   maxLen);.  }.  
31360 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20  .  /* transform 
31370 74 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61  the db path to a
31380 20 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61   unique cache na
31390 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20  me */.  dbLen = 
313a0 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61  (int)strlen(dbPa
313b0 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b  th);.  for( i=0;
313c0 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c   i<dbLen && (i+l
313d0 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65  en+7)<(int)maxLe
313e0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  n; i++){.    cha
313f0 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b  r c = dbPath[i];
31400 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e  .    lPath[i+len
31410 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27  ] = (c=='/')?'_'
31420 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b  :c;.  }.  lPath[
31430 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73  i+len]='\0';.  s
31440 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a  trlcat(lPath, ":
31450 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b  auto:", maxLen);
31460 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54  .  OSTRACE(("GET
31470 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
31480 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
31490 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67  =%d\n", lPath, g
314a0 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74  etpid()));.  ret
314b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
314c0 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65  ../* . ** Create
314d0 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  s the lock file 
314e0 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20  and any missing 
314f0 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c  directories in l
31500 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74  ockPath. */.stat
31510 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
31520 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  teLockPath(const
31530 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29   char *lockPath)
31540 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a  {.  int i, len;.
31550 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41    char buf[MAXPA
31560 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74  THLEN];.  int st
31570 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73  art = 0;.  .  as
31580 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e  sert(lockPath!=N
31590 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74  ULL);.  /* try t
315a0 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65  o create all the
315b0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69   intermediate di
315c0 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c  rectories */.  l
315d0 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
315e0 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75  (lockPath);.  bu
315f0 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[0] = lockPath[
31600 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20  0];.  for( i=1; 
31610 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20  i<len; i++ ){.  
31620 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69    if( lockPath[i
31630 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d  ] == '/' && (i -
31640 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20   start > 0) ){. 
31650 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64       /* only mkd
31660 69 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21  ir if leaf dir !
31670 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20  = "." or "/" or 
31680 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66  ".." */.      if
31690 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28  ( i-start>2 || (
316a0 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75  i-start==1 && bu
316b0 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
316c0 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
316d0 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20   '/') .         
316e0 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26  || (i-start==2 &
316f0 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
31700 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
31710 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20  +1] != '.') ){. 
31720 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c         buf[i]='\
31730 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0';.        if( 
31740 6d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54  mkdir(buf, SQLIT
31750 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
31760 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20  IR_PERMISSIONS) 
31770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
31780 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20   err=errno;.    
31790 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45        if( err!=E
317a0 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20  EXIST ) {.      
317b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
317c0 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20  CREATELOCKPATH  
317d0 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20  FAILED creating 
317e0 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %s, ".          
317f0 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27             "'%s'
31800 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
31810 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%s pid=%d\n",. 
31820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31830 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f      buf, strerro
31840 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68  r(err), lockPath
31850 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
31860 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
31870 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20   err;.          
31880 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31890 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d    }.      start=
318a0 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  i+1;.    }.    b
318b0 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68  uf[i] = lockPath
318c0 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  [i];.  }.  OSTRA
318d0 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
318e0 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
318f0 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
31900 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74  ", lockPath, get
31910 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72  pid()));.  retur
31920 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  n 0;.}..static i
31930 6e 74 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e  nt isProxyLockin
31940 67 4d 6f 64 65 28 75 6e 69 78 46 69 6c 65 20 2a  gMode(unixFile *
31950 70 46 69 6c 65 29 20 7b 0a 20 20 72 65 74 75 72  pFile) {.  retur
31960 6e 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  n (pFile->pMetho
31970 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  d == &proxyIoMet
31980 68 6f 64 73 29 20 3f 20 31 20 3a 20 30 3b 0a 7d  hods) ? 1 : 0;.}
31990 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
319a0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
319b0 20 62 61 73 65 20 70 61 74 68 20 62 61 73 65 64   base path based
319c0 20 6f 6e 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f   on the lock pro
319d0 78 79 20 66 69 6c 65 20 69 66 20 74 68 65 20 0a  xy file if the .
319e0 2a 2a 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69  ** lock proxy fi
319f0 6c 65 20 69 73 20 68 6f 73 74 65 64 20 6f 6e 20  le is hosted on 
31a00 61 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  a shared memory 
31a10 63 6f 6d 70 61 74 69 62 6c 65 20 46 53 0a 2a 2f  compatible FS.*/
31a20 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
31a30 61 72 20 2a 70 72 6f 78 79 53 68 61 72 65 64 4d  ar *proxySharedM
31a40 65 6d 6f 72 79 42 61 73 65 50 61 74 68 28 75 6e  emoryBasePath(un
31a50 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 20 7b  ixFile *pFile) {
31a60 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
31a70 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
31a80 75 6e 69 78 46 69 6c 65 20 2a 70 4c 6f 63 6b 46  unixFile *pLockF
31a90 69 6c 65 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ile;.  .  assert
31aa0 28 70 46 69 6c 65 21 3d 4e 55 4c 4c 20 26 26 20  (pFile!=NULL && 
31ab0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
31ac0 6e 74 65 78 74 21 3d 4e 55 4c 4c 29 3b 0a 20 20  ntext!=NULL);.  
31ad0 61 73 73 65 72 74 28 70 46 69 6c 65 2d 3e 70 4d  assert(pFile->pM
31ae0 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49  ethod == &proxyI
31af0 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20 70 43 74  oMethods);.  pCt
31b00 78 20 3d 20 28 28 70 72 6f 78 79 4c 6f 63 6b 69  x = ((proxyLocki
31b10 6e 67 43 6f 6e 74 65 78 74 20 2a 29 28 70 46 69  ngContext *)(pFi
31b20 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
31b30 78 74 29 29 3b 0a 20 20 70 4c 6f 63 6b 46 69 6c  xt));.  pLockFil
31b40 65 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  e = pCtx->lockPr
31b50 6f 78 79 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b  oxy;.  if( pLock
31b60 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 69  File->pMethod->i
31b70 56 65 72 73 69 6f 6e 3e 3d 32 20 26 26 20 70 4c  Version>=2 && pL
31b80 6f 63 6b 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ockFile->pMethod
31b90 2d 3e 78 53 68 6d 4d 61 70 21 3d 30 20 29 7b 0a  ->xShmMap!=0 ){.
31ba0 20 20 20 20 72 65 74 75 72 6e 20 70 43 74 78 2d      return pCtx-
31bb0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
31bc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 4e 55 4c    }.  return NUL
31bd0 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  L;.}../*.** Crea
31be0 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c  te a new VFS fil
31bf0 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74  e descriptor (st
31c00 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ored in memory o
31c10 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
31c20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
31c30 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c  and open the fil
31c40 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69  e named "path" i
31c50 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
31c60 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iptor..**.** The
31c70 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
31c80 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20  nsible not only 
31c90 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  for closing the 
31ca0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
31cb0 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20  ** but also for 
31cc0 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f  freeing the memo
31cd0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
31ce0 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  th the file desc
31cf0 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  riptor..*/.stati
31d00 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
31d10 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63  eUnixFile(.    c
31d20 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
31d30 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20          /* path 
31d40 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
31d50 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  File */.    unix
31d60 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20  File **ppFile,  
31d70 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65       /* unixFile
31d80 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74   created and ret
31d90 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a  urned by ref */.
31da0 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69      int islockfi
31db0 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le           /* 
31dc0 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73  if non zero miss
31dd0 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65  ing dirs will be
31de0 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a   created */.) {.
31df0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
31e00 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b   int dirfd = -1;
31e10 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
31e20 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
31e30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f  LITE_OK;.  int o
31e40 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
31e50 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73  R | O_CREAT;.  s
31e60 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79  qlite3_vfs dummy
31e70 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e  Vfs;.  int terrn
31e80 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75  o = 0;.  UnixUnu
31e90 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
31ea0 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20   NULL;..  /* 1. 
31eb0 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65  first try to ope
31ec0 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
31ed0 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61  e.  ** 2. if tha
31ee0 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69  t fails, and thi
31ef0 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65  s is a lock file
31f00 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72   (not-conch), tr
31f10 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  y creating.  ** 
31f20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
31f30 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20  tories and then 
31f40 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20  try again..  ** 
31f50 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  3. if that fails
31f60 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68  , try to open th
31f70 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79  e file read-only
31f80 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  .  ** otherwise 
31f90 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20  return BUSY (if 
31fa0 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41  lock file) or CA
31fb0 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63  NTOPEN for the c
31fc0 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20  onch file.  */. 
31fd0 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
31fe0 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20  eusableFd(path, 
31ff0 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66  openFlags);.  if
32000 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
32010 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
32020 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
32030 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
32040 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
32050 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
32060 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
32070 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
32080 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
32090 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
320a0 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ){.    fd = robu
320b0 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
320c0 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f  enFlags, SQLITE_
320d0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
320e0 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74  MISSIONS);.    t
320f0 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
32100 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
32110 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20  rrno==ENOENT && 
32120 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
32130 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65      if( proxyCre
32140 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68  ateLockPath(path
32150 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  ) == SQLITE_OK )
32160 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72  {.        fd = r
32170 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c  obust_open(path,
32180 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49   openFlags, SQLI
32190 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
321a0 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
321b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
321c0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
321d0 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f    openFlags = O_
321e0 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d  RDONLY;.    fd =
321f0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
32200 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
32210 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
32220 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
32230 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72      terrno = err
32240 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  no;.  }.  if( fd
32250 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
32260 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b  3_free(pUnused);
32270 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66  .    if( islockf
32280 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ile ){.      ret
32290 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
322a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
322b0 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20  h (terrno) {.   
322c0 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a     case EACCES:.
322d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
322e0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
322f0 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20    case EIO: .   
32300 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
32310 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f  TE_IOERR_LOCK; /
32320 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  * even though it
32330 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f   is the conch */
32340 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
32350 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
32360 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
32370 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  KPT;.    }.  }. 
32380 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78   .  pNew = (unix
32390 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  File *)sqlite3_m
323a0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e  alloc(sizeof(*pN
323b0 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ew));.  if( pNew
323c0 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  ==NULL ){.    rc
323d0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
323e0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72  .    goto end_cr
323f0 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a  eate_proxy;.  }.
32400 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
32410 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
32420 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65  e));.  pNew->ope
32430 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
32440 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  gs;.  memset(&du
32450 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f  mmyVfs, 0, sizeo
32460 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20  f(dummyVfs));.  
32470 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74  dummyVfs.pAppDat
32480 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f  a = (void*)&auto
32490 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20  lockIoFinder;.  
324a0 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d  dummyVfs.zName =
324b0 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75   "dummy";.  pUnu
324c0 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
324d0 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
324e0 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e   openFlags;.  pN
324f0 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55  ew->pUnused = pU
32500 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d  nused;.  .  rc =
32510 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
32520 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 64  &dummyVfs, fd, d
32530 69 72 66 64 2c 20 28 73 71 6c 69 74 65 33 5f 66  irfd, (sqlite3_f
32540 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c  ile*)pNew, path,
32550 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
32560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32570 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20  {.    *ppFile = 
32580 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e  pNew;.    return
32590 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
325a0 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
325b0 3a 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63  :    .  robust_c
325c0 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f  lose(pNew, fd, _
325d0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69  _LINE__);.  sqli
325e0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
325f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
32600 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72  Unused);.  retur
32610 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
32620 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73  SQLITE_TEST./* s
32630 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
32640 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
32650 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
32660 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69   file paths */.i
32670 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  nt sqlite3_hosti
32680 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  d_num = 0;.#endi
32690 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  f..#define PROXY
326a0 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36  _HOSTIDLEN    16
326b0 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
326c0 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a  host id length *
326d0 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73  /../* Not always
326e0 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
326f0 68 65 61 64 65 72 73 20 61 73 20 69 74 20 6f 75  headers as it ou
32700 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74  ght to be */.ext
32710 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75  ern int gethostu
32720 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63  uid(uuid_t id, c
32730 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65  onst struct time
32740 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a  spec *wait);../*
32750 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44   get the host ID
32760 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64   via gethostuuid
32770 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74  (), pHostID must
32780 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f   point to PROXY_
32790 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79  HOSTIDLEN .** by
327a0 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20  tes of writable 
327b0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
327c0 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f  c int proxyGetHo
327d0 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68  stID(unsigned ch
327e0 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74  ar *pHostID, int
327f0 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73   *pError){.  ass
32800 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44  ert(PROXY_HOSTID
32810 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75  LEN == sizeof(uu
32820 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74  id_t));.  memset
32830 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f  (pHostID, 0, PRO
32840 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23  XY_HOSTIDLEN);.#
32850 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41 58  if defined(__MAX
32860 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49  _OS_X_VERSION_MI
32870 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a 20 20 20  N_REQUIRED)\.   
32880 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 5f              && _
32890 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAC_OS_X_VERSIO
328a0 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c 31  N_MIN_REQUIRED<1
328b0 30 35 30 0a 20 20 7b 0a 20 20 20 20 73 74 61 74  050.  {.    stat
328c0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
328d0 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74  timespec timeout
328e0 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20   = {1, 0}; /* 1 
328f0 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20  sec timeout */. 
32900 20 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75     if( gethostuu
32910 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d  id(pHostID, &tim
32920 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69  eout) ){.      i
32930 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a  nt err = errno;.
32940 20 20 20 20 20 20 69 66 28 20 70 45 72 72 6f 72        if( pError
32950 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72   ){.        *pEr
32960 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20  ror = err;.     
32970 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
32980 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
32990 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23    }.  }.#endif.#
329a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
329b0 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20  T.  /* simulate 
329c0 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62  multiple hosts b
329d0 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75  y creating uniqu
329e0 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61  e hostid file pa
329f0 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ths */.  if( sql
32a00 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
32a10 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74  != 0){.    pHost
32a20 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70  ID[0] = (char)(p
32a30 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61  HostID[0] + (cha
32a40 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  r)(sqlite3_hosti
32a50 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a  d_num & 0xFF));.
32a60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
32a70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
32a80 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63  ;.}../* The conc
32a90 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  h file contains 
32aa0 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74  the header, host
32ab0 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c   id and lock fil
32ac0 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69  e path. */.#defi
32ad0 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ne PROXY_CONCHVE
32ae0 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62  RSION 2   /* 1-b
32af0 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62  yte header, 16-b
32b00 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74  yte host id, pat
32b10 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  h */.#define PRO
32b20 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20  XY_HEADERLEN    
32b30 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c  1   /* conch fil
32b40 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20  e header length 
32b50 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
32b60 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28 50  _PATHINDEX    (P
32b70 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
32b80 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a  ROXY_HOSTIDLEN).
32b90 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41  #define PROXY_MA
32ba0 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58  XCONCHLEN  (PROX
32bb0 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58  Y_HEADERLEN+PROX
32bc0 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50  Y_HOSTIDLEN+MAXP
32bd0 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20  ATHLEN)../* .** 
32be0 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f  Takes an open co
32bf0 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73  nch file, copies
32c00 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f   the contents to
32c10 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20   a new path and 
32c20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69  then moves .** i
32c30 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77  t back.  The new
32c40 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65 27  ly created file'
32c50 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  s file descripto
32c60 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f  r is assigned to
32c70 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69   the.** conch fi
32c80 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  le structure and
32c90 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69   finally the ori
32ca0 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65  ginal conch file
32cb0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a   descriptor is .
32cc0 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75  ** closed.  Retu
32cd0 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63  rns zero if succ
32ce0 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69  essful..*/.stati
32cf0 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b  c int proxyBreak
32d00 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69  ConchLock(unixFi
32d10 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f  le *pFile, uuid_
32d20 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70  t myHostID){.  p
32d30 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
32d40 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
32d50 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
32d60 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
32d70 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78  Context; .  unix
32d80 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
32d90 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
32da0 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b  e;.  char tPath[
32db0 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63  MAXPATHLEN];.  c
32dc0 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41  har buf[PROXY_MA
32dd0 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68  XCONCHLEN];.  ch
32de0 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78  ar *cPath = pCtx
32df0 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b  ->conchFilePath;
32e00 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65  .  size_t readLe
32e10 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20  n = 0;.  size_t 
32e20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63  pathLen = 0;.  c
32e30 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d  har errmsg[64] =
32e40 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   "";.  int fd = 
32e50 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d  -1;.  int rc = -
32e60 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  1;.  UNUSED_PARA
32e70 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44 29 3b  METER(myHostID);
32e80 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20  ..  /* create a 
32e90 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70 6c  new path by repl
32ea0 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  ace the trailing
32eb0 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27   '-conch' with '
32ec0 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74  -break' */.  pat
32ed0 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74  hLen = strlcpy(t
32ee0 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58  Path, cPath, MAX
32ef0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20  PATHLEN);.  if( 
32f00 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c  pathLen>MAXPATHL
32f10 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20  EN || pathLen<6 
32f20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70  || .     (strlcp
32f30 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e  y(&tPath[pathLen
32f40 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29  -5], "break", 6)
32f50 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 71   != 5) ){.    sq
32f60 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
32f70 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72  izeof(errmsg),er
32f80 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f 72  rmsg,"path error
32f90 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29   (len %d)",(int)
32fa0 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  pathLen);.    go
32fb0 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
32fc0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20  ;.  }.  /* read 
32fd0 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e  the conch conten
32fe0 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d  t */.  readLen =
32ff0 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69   osPread(conchFi
33000 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58  le->h, buf, PROX
33010 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30  Y_MAXCONCHLEN, 0
33020 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65 6e  );.  if( readLen
33030 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  <PROXY_PATHINDEX
33040 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
33050 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
33060 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22  errmsg),errmsg,"
33070 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20  read error (len 
33080 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64 4c 65  %d)",(int)readLe
33090 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  n);.    goto end
330a0 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
330b0 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75    /* write it ou
330c0 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  t to the tempora
330d0 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f  ry break file */
330e0 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f  .  fd = robust_o
330f0 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52 44  pen(tPath, (O_RD
33100 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43  WR|O_CREAT|O_EXC
33110 4c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  L),.            
33120 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
33130 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
33140 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66  SSIONS);.  if( f
33150 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  d<0 ){.    sqlit
33160 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
33170 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
33180 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c  sg, "create fail
33190 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
331a0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
331b0 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
331c0 69 66 28 20 6f 73 50 77 72 69 74 65 28 66 64 2c  if( osPwrite(fd,
331d0 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30   buf, readLen, 0
331e0 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65  ) != (ssize_t)re
331f0 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  adLen ){.    sql
33200 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
33210 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
33220 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61 69  rmsg, "write fai
33230 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
33240 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
33250 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
33260 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74   if( rename(tPat
33270 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20  h, cPath) ){.   
33280 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
33290 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
332a0 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d  , errmsg, "renam
332b0 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
332c0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
332d0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
332e0 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
332f0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
33300 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63  "broke stale loc
33310 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74  k on %s\n", cPat
33320 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f  h);.  robust_clo
33330 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46  se(pFile, conchF
33340 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  ile->h, __LINE__
33350 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  );.  conchFile->
33360 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46  h = fd;.  conchF
33370 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  ile->openFlags =
33380 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
33390 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  T;..end_breakloc
333a0 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  k:.  if( rc ){. 
333b0 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
333c0 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 74 50 61        unlink(tPa
333d0 74 68 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73  th);.      robus
333e0 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66  t_close(pFile, f
333f0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
33400 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
33410 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20  stderr, "failed 
33420 74 6f 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c  to break stale l
33430 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22  ock on %s, %s\n"
33440 2c 20 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29  , cPath, errmsg)
33450 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
33460 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68  c;.}../* Take th
33470 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
33480 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
33490 6c 65 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73  le and break a s
334a0 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65  tale lock if the
334b0 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74   .** host id mat
334c0 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ches..*/.static 
334d0 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  int proxyConchLo
334e0 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
334f0 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73  le, uuid_t myHos
33500 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70  tID, int lockTyp
33510 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
33520 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
33530 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
33540 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
33550 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
33560 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
33570 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
33580 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20  onchFile;.  int 
33590 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
335a0 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30    int nTries = 0
335b0 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  ;.  struct times
335c0 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  pec conchModTime
335d0 3b 0a 20 20 0a 20 20 64 6f 20 7b 0a 20 20 20 20  ;.  .  do {.    
335e0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
335f0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
33600 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
33610 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
33620 65 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b  e);.    nTries +
33630 2b 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  +;.    if( rc==S
33640 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
33650 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f      /* If the lo
33660 63 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79 29  ck failed (busy)
33670 3a 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20 74  :.       * 1st t
33680 72 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20  ry: get the mod 
33690 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63  time of the conc
336a0 68 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64  h, wait 0.5s and
336b0 20 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20   try again. .   
336c0 20 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66      * 2nd try: f
336d0 61 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74  ail if the mod t
336e0 69 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68  ime changed or h
336f0 6f 73 74 20 69 64 20 69 73 20 64 69 66 66 65 72  ost id is differ
33700 65 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20  ent, wait .     
33710 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 31 30    *           10
33720 20 73 65 63 20 61 6e 64 20 74 72 79 20 61 67 61   sec and try aga
33730 69 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20  in.       * 3rd 
33740 74 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c  try: break the l
33750 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  ock unless the m
33760 6f 64 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e  od time has chan
33770 67 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ged..       */. 
33780 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
33790 20 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20   buf;.      if( 
337a0 6f 73 46 73 74 61 74 28 63 6f 6e 63 68 46 69 6c  osFstat(conchFil
337b0 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20  e->h, &buf) ){. 
337c0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
337d0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
337e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
337f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
33800 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
33810 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69   .      if( nTri
33820 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  es==1 ){.       
33830 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20   conchModTime = 
33840 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
33850 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  ;.        usleep
33860 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69  (500000); /* wai
33870 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72  t 0.5 sec and tr
33880 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e  y the lock again
33890 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  */.        conti
338a0 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a  nue;  .      }..
338b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54        assert( nT
338c0 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20  ries>1 );.      
338d0 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  if( conchModTime
338e0 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73  .tv_sec != buf.s
338f0 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73  t_mtimespec.tv_s
33900 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ec || .         
33910 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
33920 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d  nsec != buf.st_m
33930 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63  timespec.tv_nsec
33940 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
33950 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
33960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
33970 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d       if( nTries=
33980 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20  =2 ){  .        
33990 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f  char tBuf[PROXY_
339a0 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
339b0 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
339c0 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c  osPread(conchFil
339d0 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58  e->h, tBuf, PROX
339e0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30  Y_MAXCONCHLEN, 0
339f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
33a00 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en<0 ){.        
33a10 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
33a20 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
33a30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
33a40 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
33a50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33a60 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f    if( len>PROXY_
33a70 50 41 54 48 49 4e 44 45 58 20 26 26 20 74 42 75  PATHINDEX && tBu
33a80 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58  f[0]==(char)PROX
33a90 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b  Y_CONCHVERSION){
33aa0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
33ab0 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
33ac0 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ck if the host i
33ad0 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  d doesn't match 
33ae0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
33af0 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66   0!=memcmp(&tBuf
33b00 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
33b10 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f  ], myHostID, PRO
33b20 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b  XY_HOSTIDLEN) ){
33b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
33b40 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
33b50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
33b60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33b70 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
33b80 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  reak the lock on
33b90 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61   short read or a
33ba0 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63   version mismatc
33bb0 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  h */.          r
33bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
33bd0 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
33be0 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30 30       usleep(1000
33bf0 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31  0000); /* wait 1
33c00 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  0 sec and try th
33c10 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a  e lock again */.
33c20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
33c30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
33c40 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20   .      assert( 
33c50 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20  nTries==3 );.   
33c60 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42     if( 0==proxyB
33c70 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  reakConchLock(pF
33c80 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29  ile, myHostID) )
33c90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
33ca0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
33cb0 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
33cc0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
33cd0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
33ce0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
33cf0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
33d00 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
33d10 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ile, SHARED_LOCK
33d20 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  );          .   
33d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
33d40 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
33d50 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
33d60 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
33d70 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
33d80 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63  *)conchFile, loc
33d90 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20  kType);.        
33da0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
33db0 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53    } while( rc==S
33dc0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 6e 54  QLITE_BUSY && nT
33dd0 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72  ries<3 );.  .  r
33de0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
33df0 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63 68 20  Takes the conch 
33e00 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68 61 72  by taking a shar
33e10 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64  ed lock and read
33e20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f   the contents co
33e30 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b  nch, if .** lock
33e40 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  Path is non-NULL
33e50 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  , the host ID an
33e60 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
33e70 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20 41 20   must match.  A 
33e80 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74  NULL .** lockPat
33e90 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  h means that the
33ea0 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74 68 65   lockPath in the
33eb0 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c   conch file will
33ec0 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
33ed0 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d 61 74  .** host IDs mat
33ee0 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63  ch, or a new loc
33ef0 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 67  k path will be g
33f00 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61 74  enerated automat
33f10 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77  ically .** and w
33f20 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63 6f  ritten to the co
33f30 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nch file..*/.sta
33f40 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 61 6b  tic int proxyTak
33f50 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20  eConch(unixFile 
33f60 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79  *pFile){.  proxy
33f70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
33f80 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
33f90 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
33fa0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
33fb0 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28 20 70  ext; .  .  if( p
33fc0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d  Ctx->conchHeld!=
33fd0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
33fe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
33ff0 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  se{.    unixFile
34000 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
34010 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
34020 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74     uuid_t myHost
34030 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45 72 72  ID;.    int pErr
34040 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  or = 0;.    char
34050 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d   readBuf[PROXY_M
34060 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
34070 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d   char lockPath[M
34080 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20  AXPATHLEN];.    
34090 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61  char *tempLockPa
340a0 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  th = NULL;.    i
340b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
340c0 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72 65 61 74  K;.    int creat
340d0 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20  eConch = 0;.    
340e0 69 6e 74 20 68 6f 73 74 49 64 4d 61 74 63 68 20  int hostIdMatch 
340f0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 61  = 0;.    int rea
34100 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e  dLen = 0;.    in
34110 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68  t tryOldLockPath
34120 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f   = 0;.    int fo
34130 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d  rceNewLockPath =
34140 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53 54   0;.    .    OST
34150 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48  RACE(("TAKECONCH
34160 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
34170 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %d\n", conchFile
34180 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
34190 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f    (pCtx->lockPro
341a0 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c  xyPath ? pCtx->l
341b0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22  ockProxyPath : "
341c0 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64  :auto:"), getpid
341d0 28 29 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  ()));..    rc = 
341e0 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 6d  proxyGetHostID(m
341f0 79 48 6f 73 74 49 44 2c 20 26 70 45 72 72 6f 72  yHostID, &pError
34200 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
34210 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
34220 52 52 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  RR ){.      pFil
34230 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70  e->lastErrno = p
34240 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74  Error;.      got
34250 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
34260 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
34270 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
34280 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
34290 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
342a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
342b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
342c0 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
342d0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65  .    }.    /* re
342e0 61 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ad the existing 
342f0 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
34300 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b    readLen = seek
34310 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c  AndRead((unixFil
34320 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c  e*)conchFile, 0,
34330 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f   readBuf, PROXY_
34340 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20  MAXCONCHLEN);.  
34350 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20    if( readLen<0 
34360 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20  ){.      /* I/O 
34370 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f  error: lastErrno
34380 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52   set by seekAndR
34390 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69  ead */.      pFi
343a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
343b0 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45  conchFile->lastE
343c0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
343d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
343e0 41 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  AD;.      goto e
343f0 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
34400 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 61 64    }else if( read
34410 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44  Len<=(PROXY_HEAD
34420 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
34430 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20  IDLEN) || .     
34440 20 20 20 20 20 20 20 20 72 65 61 64 42 75 66 5b          readBuf[
34450 30 5d 21 3d 28 63 68 61 72 29 50 52 4f 58 59 5f  0]!=(char)PROXY_
34460 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a  CONCHVERSION ){.
34470 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74        /* a short
34480 20 72 65 61 64 20 6f 72 20 76 65 72 73 69 6f 6e   read or version
34490 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63 68   format mismatch
344a0 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
344b0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 0a  o create a new .
344c0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66        ** conch f
344d0 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ile. .      */. 
344e0 20 20 20 20 20 63 72 65 61 74 65 43 6f 6e 63 68       createConch
344f0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
34500 2f 2a 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  /* if the host i
34510 64 20 6d 61 74 63 68 65 73 20 61 6e 64 20 74 68  d matches and th
34520 65 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72 65  e lock path alre
34530 61 64 79 20 65 78 69 73 74 73 20 69 6e 20 74 68  ady exists in th
34540 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77  e conch.    ** w
34550 65 27 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  e'll try to use 
34560 74 68 65 20 70 61 74 68 20 74 68 65 72 65 2c 20  the path there, 
34570 69 66 20 77 65 20 63 61 6e 27 74 20 6f 70 65 6e  if we can't open
34580 20 74 68 61 74 20 70 61 74 68 2c 20 77 65 27 6c   that path, we'l
34590 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74 72 79 20  l .    ** retry 
345a0 77 69 74 68 20 61 20 6e 65 77 20 61 75 74 6f 2d  with a new auto-
345b0 67 65 6e 65 72 61 74 65 64 20 70 61 74 68 20 0a  generated path .
345c0 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20      */.    do { 
345d0 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65  /* in case we ne
345e0 65 64 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20  ed to try again 
345f0 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61  for an :auto: na
34600 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  med lock file */
34610 0a 0a 20 20 20 20 20 20 69 66 28 20 21 63 72 65  ..      if( !cre
34620 61 74 65 43 6f 6e 63 68 20 26 26 20 21 66 6f 72  ateConch && !for
34630 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b  ceNewLockPath ){
34640 0a 20 20 20 20 20 20 20 20 68 6f 73 74 49 64 4d  .        hostIdM
34650 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26  atch = !memcmp(&
34660 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 48 45  readBuf[PROXY_HE
34670 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74  ADERLEN], myHost
34680 49 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ID, .           
34690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346a0 20 20 20 20 20 20 20 50 52 4f 58 59 5f 48 4f 53         PROXY_HOS
346b0 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  TIDLEN);.       
346c0 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68   /* if the conch
346d0 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70 61 72   has data compar
346e0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a  e the contents *
346f0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
34700 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
34710 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
34720 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65  /* for auto-name
34730 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  d local lock fil
34740 65 2c 20 6a 75 73 74 20 63 68 65 63 6b 20 74 68  e, just check th
34750 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 77 65  e host ID and we
34760 27 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 2a  'll.           *
34770 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20  * use the local 
34780 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74  lock file path t
34790 68 61 74 27 73 20 61 6c 72 65 61 64 79 20 69 6e  hat's already in
347a0 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
347b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
347c0 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 29  f( hostIdMatch )
347d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 69  {.            si
347e0 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 28  ze_t pathLen = (
347f0 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f  readLen - PROXY_
34800 50 41 54 48 49 4e 44 45 58 29 3b 0a 20 20 20 20  PATHINDEX);.    
34810 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
34820 20 20 20 20 20 69 66 28 20 70 61 74 68 4c 65 6e       if( pathLen
34830 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a  >=MAXPATHLEN ){.
34840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
34850 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e  thLen=MAXPATHLEN
34860 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
34870 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
34880 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26  mcpy(lockPath, &
34890 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41  readBuf[PROXY_PA
348a0 54 48 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65  THINDEX], pathLe
348b0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
348c0 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e  lockPath[pathLen
348d0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
348e0 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20     tempLockPath 
348f0 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20  = lockPath;.    
34900 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f          tryOldLo
34910 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20  ckPath = 1;.    
34920 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74          /* creat
34930 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
34940 6c 6f 63 6b 20 70 61 74 68 20 69 66 20 74 68 65  lock path if the
34950 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20   conch is taken 
34960 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  */.            g
34970 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
34980 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
34990 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
349a0 20 68 6f 73 74 49 64 4d 61 74 63 68 0a 20 20 20   hostIdMatch.   
349b0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 21              && !
349c0 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f  strncmp(pCtx->lo
349d0 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 26 72 65  ckProxyPath, &re
349e0 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48  adBuf[PROXY_PATH
349f0 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20 20 20 20  INDEX],.        
34a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a10 20 20 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58 59     readLen-PROXY
34a20 5f 50 41 54 48 49 4e 44 45 58 29 0a 20 20 20 20  _PATHINDEX).    
34a30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
34a40 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73 74 20 61   /* conch host a
34a50 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20 6d 61 74  nd lock path mat
34a60 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
34a70 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
34a80 63 68 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  ch; .        }. 
34a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
34aa0 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f      /* if the co
34ab0 6e 63 68 20 69 73 6e 27 74 20 77 72 69 74 61 62  nch isn't writab
34ac0 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d  le and doesn't m
34ad0 61 74 63 68 2c 20 77 65 20 63 61 6e 27 74 20 74  atch, we can't t
34ae0 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ake it */.      
34af0 69 66 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  if( (conchFile->
34b00 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52  openFlags&O_RDWR
34b10 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20  ) == 0 ){.      
34b20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
34b30 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  SY;.        goto
34b40 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
34b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
34b60 20 20 20 20 20 2f 2a 20 65 69 74 68 65 72 20 74       /* either t
34b70 68 65 20 63 6f 6e 63 68 20 64 69 64 6e 27 74 20  he conch didn't 
34b80 6d 61 74 63 68 20 6f 72 20 77 65 20 6e 65 65 64  match or we need
34b90 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
34ba0 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 66   one */.      if
34bb0 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
34bc0 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
34bd0 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61    proxyGetLockPa
34be0 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  th(pCtx->dbPath,
34bf0 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41   lockPath, MAXPA
34c00 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  THLEN);.        
34c10 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c  tempLockPath = l
34c20 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20  ockPath;.       
34c30 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70   /* create a cop
34c40 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61  y of the lock pa
34c50 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20 74 68 65  th _only_ if the
34c60 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20   conch is taken 
34c70 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
34c80 20 0a 20 20 20 20 20 20 2f 2a 20 75 70 64 61 74   .      /* updat
34c90 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68 6f 73  e conch with hos
34ca0 74 20 61 6e 64 20 70 61 74 68 20 28 74 68 69 73  t and path (this
34cb0 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74   will fail if ot
34cc0 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20  her process.    
34cd0 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65    ** has a share
34ce0 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c  d lock already),
34cf0 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20   if the host id 
34d00 6d 61 74 63 68 65 73 2c 20 75 73 65 20 74 68 65  matches, use the
34d10 20 62 69 67 0a 20 20 20 20 20 20 2a 2a 20 73 74   big.      ** st
34d20 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ick..      */.  
34d30 20 20 20 20 66 75 74 69 6d 65 73 28 63 6f 6e 63      futimes(conc
34d40 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b  hFile->h, NULL);
34d50 0a 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49  .      if( hostI
34d60 64 4d 61 74 63 68 20 26 26 20 21 63 72 65 61 74  dMatch && !creat
34d70 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20  eConch ){.      
34d80 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 2d    if( conchFile-
34d90 3e 70 49 6e 6f 64 65 20 26 26 20 63 6f 6e 63 68  >pInode && conch
34da0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
34db0 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 20  hared>1 ){.     
34dc0 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74       /* We are t
34dd0 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
34de0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
34df0 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
34e00 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
34e10 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
34e20 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
34e30 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
34e40 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
34e50 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
34e60 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
34e70 7b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  {          .    
34e80 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
34e90 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
34ea0 20 6d 79 48 6f 73 74 49 44 2c 20 45 58 43 4c 55   myHostID, EXCLU
34eb0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
34ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
34ed0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
34ee0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
34ef0 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
34f00 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
34f10 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  le, EXCLUSIVE_LO
34f20 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
34f30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
34f40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34f50 63 68 61 72 20 77 72 69 74 65 42 75 66 66 65 72  char writeBuffer
34f60 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
34f70 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  EN];.        int
34f80 20 77 72 69 74 65 53 69 7a 65 20 3d 20 30 3b 0a   writeSize = 0;.
34f90 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
34fa0 20 77 72 69 74 65 42 75 66 66 65 72 5b 30 5d 20   writeBuffer[0] 
34fb0 3d 20 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  = (char)PROXY_CO
34fc0 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20  NCHVERSION;.    
34fd0 20 20 20 20 6d 65 6d 63 70 79 28 26 77 72 69 74      memcpy(&writ
34fe0 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 48 45  eBuffer[PROXY_HE
34ff0 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74  ADERLEN], myHost
35000 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44  ID, PROXY_HOSTID
35010 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  LEN);.        if
35020 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ( pCtx->lockProx
35030 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20  yPath!=NULL ){. 
35040 20 20 20 20 20 20 20 20 20 73 74 72 6c 63 70 79           strlcpy
35050 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  (&writeBuffer[PR
35060 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20  OXY_PATHINDEX], 
35070 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
35080 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
35090 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
350a0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 63  .          strlc
350b0 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
350c0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
350d0 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 2c 20  , tempLockPath, 
350e0 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
350f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77       }.        w
35100 72 69 74 65 53 69 7a 65 20 3d 20 50 52 4f 58 59  riteSize = PROXY
35110 5f 50 41 54 48 49 4e 44 45 58 20 2b 20 73 74 72  _PATHINDEX + str
35120 6c 65 6e 28 26 77 72 69 74 65 42 75 66 66 65 72  len(&writeBuffer
35130 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
35140 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  ]);.        robu
35150 73 74 5f 66 74 72 75 6e 63 61 74 65 28 63 6f 6e  st_ftruncate(con
35160 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74 65  chFile->h, write
35170 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Size);.        r
35180 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28 28 73  c = unixWrite((s
35190 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f  qlite3_file *)co
351a0 6e 63 68 46 69 6c 65 2c 20 77 72 69 74 65 42 75  nchFile, writeBu
351b0 66 66 65 72 2c 20 77 72 69 74 65 53 69 7a 65 2c  ffer, writeSize,
351c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 73 79   0);.        fsy
351d0 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29  nc(conchFile->h)
351e0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;.        /* If 
351f0 77 65 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  we created a new
35200 20 63 6f 6e 63 68 20 66 69 6c 65 20 28 6e 6f 74   conch file (not
35210 20 6a 75 73 74 20 75 70 64 61 74 65 64 20 74 68   just updated th
35220 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
35230 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c  .         ** val
35240 69 64 20 63 6f 6e 63 68 20 66 69 6c 65 29 2c 20  id conch file), 
35250 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
35260 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
35270 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
35280 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
35290 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
352a0 5f 4f 4b 20 26 26 20 63 72 65 61 74 65 43 6f 6e  _OK && createCon
352b0 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
352c0 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
352d0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
352e0 72 72 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69  rr = osFstat(pFi
352f0 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  le->h, &buf);.  
35300 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 3d          if( err=
35310 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
35320 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20 3d    mode_t cmode =
35330 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53 5f   buf.st_mode&(S_
35340 49 52 55 53 52 7c 53 5f 49 57 55 53 52 20 7c 20  IRUSR|S_IWUSR | 
35350 53 5f 49 52 47 52 50 7c 53 5f 49 57 47 52 50 20  S_IRGRP|S_IWGRP 
35360 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
35370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35380 20 20 20 20 20 20 20 20 20 20 53 5f 49 52 4f 54            S_IROT
35390 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20 20  H|S_IWOTH);.    
353a0 20 20 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74          /* try t
353b0 6f 20 6d 61 74 63 68 20 74 68 65 20 64 61 74 61  o match the data
353c0 62 61 73 65 20 66 69 6c 65 20 52 2f 57 20 70 65  base file R/W pe
353d0 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f 72  rmissions, ignor
353e0 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69 66  e failure */.#if
353f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58  ndef SQLITE_PROX
35400 59 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20 20  Y_DEBUG.        
35410 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e      osFchmod(con
35420 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65  chFile->h, cmode
35430 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
35440 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
35450 20 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63         rc = osFc
35460 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  hmod(conchFile->
35470 68 2c 20 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20  h, cmode);.     
35480 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72         }while( r
35490 63 3d 3d 28 2d 31 29 20 26 26 20 65 72 72 6e 6f  c==(-1) && errno
354a0 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20  ==EINTR );.     
354b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
354c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
354d0 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72    int code = err
354e0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  no;.            
354f0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
35500 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49  , "fchmod %o FAI
35510 4c 45 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e  LED with %d %s\n
35520 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
35530 20 20 20 20 20 20 20 20 20 63 6d 6f 64 65 2c 20           cmode, 
35540 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63  code, strerror(c
35550 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ode));.         
35560 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
35570 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
35580 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f  f(stderr, "fchmo
35590 64 20 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22  d %o SUCCEDED\n"
355a0 2c 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20  ,cmode);.       
355b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
355c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
355d0 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65      int code = e
355e0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
355f0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
35600 2c 20 22 53 54 41 54 20 46 41 49 4c 45 44 5b 25  , "STAT FAILED[%
35610 64 5d 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22  d] with %d %s\n"
35620 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
35630 20 20 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65         err, code
35640 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29  , strerror(code)
35650 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
35660 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
35670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
35680 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
35690 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
356a0 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
356b0 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  le, SHARED_LOCK)
356c0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 65 6e 64  ;.      .    end
356d0 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20  _takeconch:.    
356e0 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e    OSTRACE(("TRAN
356f0 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25  SPROXY: CLOSE  %
35700 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
35710 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
35720 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
35730 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b  le->openFlags ){
35740 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
35750 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  le->h>=0 ){.    
35760 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
35770 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  se(pFile, pFile-
35780 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
35790 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
357a0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
357b0 20 20 20 20 20 20 20 20 69 6e 74 20 66 64 20 3d          int fd =
357c0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 43 74   robust_open(pCt
357d0 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  x->dbPath, pFile
357e0 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20  ->openFlags,.   
357f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35800 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
35810 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
35820 4e 53 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  NS);.        OST
35830 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58  RACE(("TRANSPROX
35840 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20  Y: OPEN  %d\n", 
35850 66 64 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  fd));.        if
35860 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
35870 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20       pFile->h = 
35880 66 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  fd;.        }els
35890 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d  e{.          rc=
358a0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
358b0 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45 5f  BKPT; /* SQLITE_
358c0 42 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43  BUSY? proxyTakeC
358d0 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20  onch called.    
358e0 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 6c 6f         during lo
358f0 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  cking */.       
35900 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
35910 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35920 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63  OK && !pCtx->loc
35930 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  kProxy ){.      
35940 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20 74    char *path = t
35950 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65  empLockPath ? te
35960 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74  mpLockPath : pCt
35970 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35980 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
35990 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
359a0 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e  le(path, &pCtx->
359b0 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20  lockProxy, 1);. 
359c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
359d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
359e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20  SQLITE_NOMEM && 
359f0 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29  tryOldLockPath )
35a00 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77  {.          /* w
35a10 65 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74  e couldn't creat
35a20 65 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  e the proxy lock
35a30 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6f   file with the o
35a40 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  ld lock file pat
35a50 68 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  h.           ** 
35a60 73 6f 20 74 72 79 20 61 67 61 69 6e 20 76 69 61  so try again via
35a70 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20   auto-naming .  
35a80 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
35a90 20 20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f        forceNewLo
35aa0 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20  ckPath = 1;.    
35ab0 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b        tryOldLock
35ac0 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Path = 0;.      
35ad0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
35ae0 20 67 6f 20 62 61 63 6b 20 74 6f 20 74 68 65 20   go back to the 
35af0 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74 61 72  do {} while star
35b00 74 20 70 6f 69 6e 74 2c 20 74 72 79 20 61 67 61  t point, try aga
35b10 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  in */.        }.
35b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35b30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35b40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  ){.        /* Ne
35b50 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70  ed to make a cop
35b60 79 20 6f 66 20 70 61 74 68 20 69 66 20 77 65 20  y of path if we 
35b70 65 78 74 72 61 63 74 65 64 20 74 68 65 20 76 61  extracted the va
35b80 6c 75 65 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  lue.         ** 
35b90 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20 66  from the conch f
35ba0 69 6c 65 20 6f 72 20 74 68 65 20 70 61 74 68 20  ile or the path 
35bb0 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e  was allocated on
35bc0 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20   the stack.     
35bd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
35be0 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20  f( tempLockPath 
35bf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74  ){.          pCt
35c00 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35c10 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
35c20 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61  up(0, tempLockPa
35c30 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  th);.          i
35c40 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
35c50 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
35c60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
35c70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
35c80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
35c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35ca0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35cb0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  ){.        pCtx-
35cc0 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a  >conchHeld = 1;.
35cd0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
35ce0 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50   if( pCtx->lockP
35cf0 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  roxy->pMethod ==
35d00 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
35d10 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 4c  {.          afpL
35d20 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61  ockingContext *a
35d30 66 70 43 74 78 3b 0a 20 20 20 20 20 20 20 20 20  fpCtx;.         
35d40 20 61 66 70 43 74 78 20 3d 20 28 61 66 70 4c 6f   afpCtx = (afpLo
35d50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
35d60 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e  Ctx->lockProxy->
35d70 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
35d80 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78            afpCtx
35d90 2d 3e 64 62 50 61 74 68 20 3d 20 70 43 74 78 2d  ->dbPath = pCtx-
35da0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
35db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35dc0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
35dd0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
35de0 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
35df0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
35e00 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  hFile, NO_LOCK);
35e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
35e20 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e  STRACE(("TAKECON
35e30 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f  CH  %d %s\n", co
35e40 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  nchFile->h,.    
35e50 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53             rc==S
35e60 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66  QLITE_OK?"ok":"f
35e70 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
35e80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
35e90 20 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69   while (1); /* i
35ea0 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74  n case we need t
35eb0 6f 20 72 65 74 72 79 20 74 68 65 20 3a 61 75 74  o retry the :aut
35ec0 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 0a  o: lock file - .
35ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ee0 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 6e 65   ** we should ne
35ef0 76 65 72 20 67 65 74 20 68 65 72 65 20 65 78 63  ver get here exc
35f00 65 70 74 20 76 69 61 20 74 68 65 20 27 63 6f 6e  ept via the 'con
35f10 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a  tinue' call. */.
35f20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
35f30 70 46 69 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f  pFile holds a lo
35f40 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20 66 69  ck on a conch fi
35f50 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65  le, then release
35f60 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73   that lock..*/.s
35f70 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 52  tatic int proxyR
35f80 65 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e 69 78  eleaseConch(unix
35f90 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
35fa0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
35fb0 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  OK;         /* S
35fc0 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
35fd0 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f 78 79   code */.  proxy
35fe0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
35ff0 70 43 74 78 3b 20 20 2f 2a 20 54 68 65 20 6c 6f  pCtx;  /* The lo
36000 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f  cking context fo
36010 72 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  r the proxy lock
36020 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
36030 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20  conchFile;      
36040 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
36050 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 0a   conch file */..
36060 20 20 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c    pCtx = (proxyL
36070 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
36080 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
36090 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68 46 69  ntext;.  conchFi
360a0 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
360b0 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43 45 28  File;.  OSTRACE(
360c0 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20  ("RELEASECONCH  
360d0 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
360e0 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
360f0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 70  h,.           (p
36100 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
36110 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
36120 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut
36130 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20  o:"), .         
36140 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20    getpid()));.  
36150 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
36160 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72 63 20  eld>0 ){.    rc 
36170 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
36180 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
36190 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
361a0 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29  chFile, NO_LOCK)
361b0 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e 63 6f  ;.  }.  pCtx->co
361c0 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 4f  nchHeld = 0;.  O
361d0 53 54 52 41 43 45 28 28 22 52 45 4c 45 41 53 45  STRACE(("RELEASE
361e0 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c  CONCH  %d %s\n",
361f0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
36200 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53            (rc==S
36210 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
36220 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20  : "failed")));. 
36230 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
36240 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
36250 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ame of a databas
36260 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20  e file, compute 
36270 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73 20  the name of its 
36280 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53  conch file..** S
36290 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20 66  tore the conch f
362a0 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72  ilename in memor
362b0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
362c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
362d0 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63  ..** Make *pConc
362e0 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20 74  hPath point to t
362f0 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65  he new name.  Re
36300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
36310 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
36320 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
36330 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e  unable to obtain
36340 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
36350 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
36360 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
36370 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 61  uring that the a
36380 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a  llocated memory.
36390 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76 65 6e  ** space is even
363a0 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  tually freed..**
363b0 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68 20  .** *pConchPath 
363c0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
363d0 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
363e0 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
363f0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
36400 74 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e  t proxyCreateCon
36410 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72 20  chPathname(char 
36420 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 2a  *dbPath, char **
36430 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20 69  pConchPath){.  i
36440 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
36450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36460 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
36470 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e 74    int len = (int
36480 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b  )strlen(dbPath);
36490 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64 61   /* Length of da
364a0 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
364b0 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20 63 68  - dbPath */.  ch
364c0 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20  ar *conchPath;  
364d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62              /* b
364e0 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74  uffer in which t
364f0 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63  o construct conc
36500 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20  h name */..  /* 
36510 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
36520 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  or the conch fil
36530 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74 69 61  ename and initia
36540 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 74 6f  lize the name to
36550 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  .  ** the name o
36560 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
36570 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
36580 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74 68    .  *pConchPath
36590 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d 20 28   = conchPath = (
365a0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
365b0 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a  alloc(len + 8);.
365c0 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 3d    if( conchPath=
365d0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
365e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
365f0 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63   }.  memcpy(conc
36600 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c  hPath, dbPath, l
36610 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  en+1);.  .  /* n
36620 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22 20  ow insert a "." 
36630 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20  before the last 
36640 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20  / character */. 
36650 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b   for( i=(len-1);
36660 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20   i>=0; i-- ){.  
36670 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 5b    if( conchPath[
36680 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
36690 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61   i++;.      brea
366a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63  k;.    }.  }.  c
366b0 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b  onchPath[i]='.';
366c0 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e  .  while ( i<len
366d0 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61 74   ){.    conchPat
366e0 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d  h[i+1]=dbPath[i]
366f0 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  ;.    i++;.  }..
36700 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65 20    /* append the 
36710 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78 20  "-conch" suffix 
36720 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  to the file */. 
36730 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50 61   memcpy(&conchPa
36740 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68  th[i+1], "-conch
36750 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72 74 28  ", 7);.  assert(
36760 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f 6e   (int)strlen(con
36770 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b 37  chPath) == len+7
36780 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51   );..  return SQ
36790 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20  LITE_OK;.}.../* 
367a0 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20 63 6f  Takes a fully co
367b0 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79 20 6c  nfigured proxy l
367c0 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e 69  ocking-style uni
367d0 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69 74 63  x file and switc
367e0 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 6c  hes.** the local
367f0 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
36800 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
36810 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61  witchLockProxyPa
36820 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  th(unixFile *pFi
36830 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
36840 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c  path) {.  proxyL
36850 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
36860 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
36870 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c  ingContext*)pFil
36880 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
36890 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50 61  t;.  char *oldPa
368a0 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th = pCtx->lockP
368b0 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e 74 20  roxyPath;.  int 
368c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
368d0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
368e0 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
368f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
36900 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20  QLITE_BUSY;.  } 
36910 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20   ..  /* nothing 
36920 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61 74  to do if the pat
36930 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f  h is NULL, :auto
36940 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68 65  : or matches the
36950 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 2a   existing path *
36960 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c  /.  if( !path ||
36970 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c   path[0]=='\0' |
36980 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20  | !strcmp(path, 
36990 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20  ":auto:") ||.   
369a0 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73 74   (oldPath && !st
369b0 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70  rncmp(oldPath, p
369c0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
369d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
369e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
369f0 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  se{.    unixFile
36a00 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43   *lockProxy = pC
36a10 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
36a20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
36a30 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43 74  xy=NULL;.    pCt
36a40 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30  x->conchHeld = 0
36a50 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72  ;.    if( lockPr
36a60 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  oxy!=NULL ){.   
36a70 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d     rc=lockProxy-
36a80 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
36a90 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
36aa0 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  )lockProxy);.   
36ab0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
36ac0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c  rn rc;.      sql
36ad0 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72  ite3_free(lockPr
36ae0 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oxy);.    }.    
36af0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c 64  sqlite3_free(old
36b00 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78 2d  Path);.    pCtx-
36b10 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
36b20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
36b30 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a 20  (0, path);.  }. 
36b40 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
36b50 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69 73  ../*.** pFile is
36b60 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
36b70 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20   been opened by 
36b80 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20 63 61  a prior xOpen ca
36b90 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20 69  ll.  dbPath.** i
36ba0 73 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  s a string buffe
36bb0 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58 50 41  r at least MAXPA
36bc0 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63 74 65  THLEN+1 characte
36bd0 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  rs in size..**.*
36be0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66  * This routine f
36bf0 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  ind the filename
36c00 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
36c10 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69 74 65   pFile and write
36c20 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50 61  s it.** int dbPa
36c30 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
36c40 74 20 67 65 74 44 62 50 61 74 68 46 6f 72 55 6e  t getDbPathForUn
36c50 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
36c60 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62  *pFile, char *db
36c70 50 61 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e  Path){.#if defin
36c80 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
36c90 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
36ca0 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  od == &afpIoMeth
36cb0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66  ods ){.    /* af
36cc0 70 20 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20  p style keeps a 
36cd0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
36ce0 20 64 62 20 70 61 74 68 20 69 6e 20 74 68 65 20   db path in the 
36cf0 66 69 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a  filePath field .
36d00 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74      ** of the st
36d10 72 75 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ruct */.    asse
36d20 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  rt( (int)strlen(
36d30 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f  (char*)pFile->lo
36d40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d  ckingContext)<=M
36d50 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20  AXPATHLEN );.   
36d60 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c   strlcpy(dbPath,
36d70 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e   ((afpLockingCon
36d80 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
36d90 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64  ckingContext)->d
36da0 62 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  bPath, MAXPATHLE
36db0 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e  N);.  } else.#en
36dc0 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  dif.  if( pFile-
36dd0 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74  >pMethod == &dot
36de0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b  lockIoMethods ){
36df0 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b  .    /* dot lock
36e00 20 73 74 79 6c 65 20 75 73 65 73 20 74 68 65 20   style uses the 
36e10 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
36e20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74  to store the dot
36e30 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c   lock.    ** fil
36e40 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e  e path */.    in
36e50 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28  t len = strlen((
36e60 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
36e70 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20  ckingContext) - 
36e80 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53  strlen(DOTLOCK_S
36e90 55 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63  UFFIX);.    memc
36ea0 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72  py(dbPath, (char
36eb0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
36ec0 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20  gContext, len + 
36ed0 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
36ee0 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74   /* all other st
36ef0 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63  yles use the loc
36f00 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20  king context to 
36f10 73 74 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c  store the db fil
36f20 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73  e path */.    as
36f30 73 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68  sert( strlen((ch
36f40 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
36f50 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50  ngContext)<=MAXP
36f60 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74  ATHLEN );.    st
36f70 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 63  rlcpy(dbPath, (c
36f80 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
36f90 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58  kingContext, MAX
36fa0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20  PATHLEN);.  }.  
36fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36fc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73  ;.}../*.** Takes
36fd0 20 61 6e 20 61 6c 72 65 61 64 79 20 66 69 6c 6c   an already fill
36fe0 65 64 20 69 6e 20 75 6e 69 78 20 66 69 6c 65 20  ed in unix file 
36ff0 61 6e 64 20 61 6c 74 65 72 73 20 69 74 20 73 6f  and alters it so
37000 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e   all file lockin
37010 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65  g .** will be pe
37020 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c  rformed on the l
37030 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ocal proxy lock 
37040 66 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  file.  The follo
37050 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61  wing fields.** a
37060 72 65 20 70 72 65 73 65 72 76 65 64 20 69 6e 20  re preserved in 
37070 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
37080 65 78 74 20 73 6f 20 74 68 61 74 20 74 68 65 79  ext so that they
37090 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
370a0 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69   and .** the uni
370b0 78 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 70  x structure prop
370c0 65 72 6c 79 20 63 6c 65 61 6e 65 64 20 75 70 20  erly cleaned up 
370d0 61 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a  at close time:.*
370e0 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  *  ->lockingCont
370f0 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f  ext.**  ->pMetho
37100 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d.*/.static int 
37110 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
37120 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
37130 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68  *pFile, const ch
37140 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72  ar *path) {.  pr
37150 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
37160 74 20 2a 70 43 74 78 3b 0a 20 20 63 68 61 72 20  t *pCtx;.  char 
37170 64 62 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  dbPath[MAXPATHLE
37180 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e  N+1];       /* N
37190 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
371a0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
371b0 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c  ar *lockPath=NUL
371c0 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  L;.  int rc = SQ
371d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66  LITE_OK;.  .  if
371e0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
371f0 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  ck!=NO_LOCK ){. 
37200 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37210 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 67 65 74  _BUSY;.  }.  get
37220 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c  DbPathForUnixFil
37230 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29  e(pFile, dbPath)
37240 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c  ;.  if( !path ||
37250 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c   path[0]=='\0' |
37260 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20  | !strcmp(path, 
37270 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20  ":auto:") ){.   
37280 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a   lockPath=NULL;.
37290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63    }else{.    loc
372a0 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61  kPath=(char *)pa
372b0 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54  th;.  }.  .  OST
372c0 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58  RACE(("TRANSPROX
372d0 59 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64  Y  %d for %s pid
372e0 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
372f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f  ,.           (lo
37300 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74  ckPath ? lockPat
37310 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
37320 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 70 43  etpid()));..  pC
37330 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  tx = sqlite3_mal
37340 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  loc( sizeof(*pCt
37350 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78  x) );.  if( pCtx
37360 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
37370 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
37380 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74    }.  memset(pCt
37390 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43  x, 0, sizeof(*pC
373a0 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72  tx));..  rc = pr
373b0 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61  oxyCreateConchPa
373c0 74 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26  thname(dbPath, &
373d0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
373e0 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ath);.  if( rc==
373f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37400 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74   rc = proxyCreat
37410 65 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e  eUnixFile(pCtx->
37420 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26  conchFilePath, &
37430 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c  pCtx->conchFile,
37440 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
37450 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
37460 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65   && ((pFile->ope
37470 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d  nFlags&O_RDWR) =
37480 3d 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  = 0) ){.      /*
37490 20 69 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e   if (a) the open
374a0 20 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f   flags are not O
374b0 5f 52 44 57 52 2c 20 28 62 29 20 74 68 65 20 63  _RDWR, (b) the c
374c0 6f 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72 65  onch isn't there
374d0 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28  , and.      ** (
374e0 63 29 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  c) the file syst
374f0 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  em is read-only,
37500 20 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d   then enable no-
37510 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a  locking access..
37520 20 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69        ** Ugh, si
37530 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78  nce O_RDONLY==0x
37540 30 30 30 30 20 77 65 20 74 65 73 74 20 66 6f 72  0000 we test for
37550 20 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75   !O_RDWR since u
37560 6e 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a  nixOpen asserts.
37570 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70        ** that op
37580 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76  enFlags will hav
37590 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f  e only one of O_
375a0 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52  RDONLY or O_RDWR
375b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
375c0 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
375d0 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  sInfo;.      str
375e0 75 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e  uct stat conchIn
375f0 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f  fo;.      int go
37600 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20  Lockless = 0;.. 
37610 20 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28       if( osStat(
37620 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
37630 61 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29  ath, &conchInfo)
37640 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20   == -1 ) {.     
37650 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72     int err = err
37660 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  no;.        if( 
37670 28 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26  (err==ENOENT) &&
37680 20 28 73 74 61 74 66 73 28 64 62 50 61 74 68 2c   (statfs(dbPath,
37690 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29   &fsInfo) != -1)
376a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
376b0 4c 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e  Lockless = (fsIn
376c0 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52  fo.f_flags&MNT_R
376d0 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44  DONLY) == MNT_RD
376e0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ONLY;.        }.
376f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
37700 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a  ( goLockless ){.
37710 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f          pCtx->co
37720 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a  nchHeld = -1; /*
37730 20 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c   read only FS/ l
37740 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20  ockless */.     
37750 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
37760 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
37770 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d  .  }  .  if( rc=
37780 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f  =SQLITE_OK && lo
37790 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43  ckPath ){.    pC
377a0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
377b0 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
377c0 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29  Dup(0, lockPath)
377d0 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
377e0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3d 3d 4e  lockProxyPath==N
377f0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ULL ){.      rc 
37800 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
37810 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
37820 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37830 7b 0a 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61  {.    pCtx->dbPa
37840 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
37850 72 44 75 70 28 30 2c 20 64 62 50 61 74 68 29 3b  rDup(0, dbPath);
37860 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 64  .    if( pCtx->d
37870 62 50 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  bPath==NULL ){. 
37880 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
37890 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
378a0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
378b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
378c0 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c  all memory is al
378d0 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79 73 20  located, proxys 
378e0 61 72 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  are created and 
378f0 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a  assigned, .    *
37900 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c 6f 63  * switch the loc
37910 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64  king context and
37920 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 72 65   pMethod then re
37930 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  turn..    */.   
37940 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e   pCtx->oldLockin
37950 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c 65  gContext = pFile
37960 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
37970 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  ;.    pFile->loc
37980 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
37990 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f  tx;.    pCtx->pO
379a0 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65  ldMethod = pFile
379b0 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70  ->pMethod;.    p
379c0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
379d0 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b  &proxyIoMethods;
379e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
379f0 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  ( pCtx->conchFil
37a00 65 20 29 7b 20 0a 20 20 20 20 20 20 70 43 74 78  e ){ .      pCtx
37a10 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  ->conchFile->pMe
37a20 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
37a30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 43 74  lite3_file *)pCt
37a40 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
37a50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
37a60 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
37a70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
37a80 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
37a90 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
37aa0 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
37ab0 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63  _free(pCtx->conc
37ac0 68 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20  hFilePath); .   
37ad0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
37ae0 74 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  tx);.  }.  OSTRA
37af0 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20  CE(("TRANSPROXY 
37b00 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65   %d %s\n", pFile
37b10 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
37b20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
37b30 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
37b40 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
37b50 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
37b60 20 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73   routine handles
37b70 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
37b80 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68  ntrol() calls th
37b90 61 74 20 61 72 65 20 73 70 65 63 69 66 69 63 0a  at are specific.
37ba0 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b  ** to proxy lock
37bb0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
37bc0 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  nt proxyFileCont
37bd0 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
37be0 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
37bf0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69  id *pArg){.  swi
37c00 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
37c10 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  ase SQLITE_GET_L
37c20 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a  OCKPROXYFILE: {.
37c30 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
37c40 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
37c50 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 66 28  e*)id;.      if(
37c60 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d   isProxyLockingM
37c70 6f 64 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ode(pFile) ){.  
37c80 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69        proxyLocki
37c90 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
37ca0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
37cb0 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
37cc0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
37cd0 20 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b 65         proxyTake
37ce0 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
37cf0 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
37d00 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
37d10 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e  .          *(con
37d20 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20  st char **)pArg 
37d30 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
37d40 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
37d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
37d60 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
37d70 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28  pArg = ":auto: (
37d80 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20  not held)";.    
37d90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
37da0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63  se {.        *(c
37db0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
37dc0 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  g = NULL;.      
37dd0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
37de0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
37df0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
37e00 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
37e10 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  E: {.      unixF
37e20 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
37e30 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
37e40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37e50 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20  E_OK;.      int 
37e60 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 69  isProxyStyle = i
37e70 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
37e80 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
37e90 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c  if( pArg==NULL |
37ea0 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  | (const char *)
37eb0 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pArg==0 ){.     
37ec0 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74     if( isProxySt
37ed0 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  yle ){.         
37ee0 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f   /* turn off pro
37ef0 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74  xy locking - not
37f00 20 73 75 70 70 6f 72 74 65 64 2e 20 20 49 66 20   supported.  If 
37f10 73 75 70 70 6f 72 74 20 69 73 20 61 64 64 65 64  support is added
37f20 20 66 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a   for.          *
37f30 2a 20 73 77 69 74 63 68 69 6e 67 20 70 72 6f 78  * switching prox
37f40 79 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 6f  y locking mode o
37f50 66 66 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  ff then it will 
37f60 6e 65 65 64 20 74 6f 20 66 61 69 6c 20 69 66 0a  need to fail if.
37f70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
37f80 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 69 73   journal mode is
37f90 20 57 41 4c 20 6d 6f 64 65 2e 20 0a 20 20 20 20   WAL mode. .    
37fa0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
37fb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
37fc0 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52  RROR /*SQLITE_PR
37fd0 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d  OTOCOL? SQLITE_M
37fe0 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20  ISUSE?*/;.      
37ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
38000 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70     /* turn off p
38010 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61  roxy locking - a
38020 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f  lready off - NOO
38030 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  P */.          r
38040 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
38050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
38060 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
38070 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50  nst char *proxyP
38080 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ath = (const cha
38090 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  r *)pArg;.      
380a0 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79    if( isProxySty
380b0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
380c0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
380d0 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20  ext *pCtx = .   
380e0 20 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c           (proxyL
380f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
38100 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
38110 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  text;.          
38120 69 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67  if( !strcmp(pArg
38130 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20  , ":auto:") .   
38140 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78          || (pCtx
38150 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
38160 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
38170 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d    !strncmp(pCtx-
38180 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20  >lockProxyPath, 
38190 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41  proxyPath, MAXPA
381a0 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20  THLEN)).        
381b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
381c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
381d0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
381e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
381f0 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f   = switchLockPro
38200 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72  xyPath(pFile, pr
38210 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20  oxyPath);.      
38220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
38230 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
38240 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20  * turn on proxy 
38250 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  file locking */.
38260 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
38270 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
38280 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f  xFile(pFile, pro
38290 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
382a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
382b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
382c0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
382d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
382e0 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c   );  /* The call
382f0 20 61 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e   assures that on
38300 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73  ly valid opcodes
38310 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20   are sent */.   
38320 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
38330 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e  ACHED*/.  return
38340 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
38350 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74  ../*.** Within t
38360 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68  his division (th
38370 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69  e proxying locki
38380 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
38390 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  n) the procedure
383a0 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20  s.** above this 
383b0 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74  point are all ut
383c0 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f  ilities.  The lo
383d0 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f  ck-related metho
383e0 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f  ds of the.** pro
383f0 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74  xy-locking sqlit
38400 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a  e3_io_method obj
38410 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a  ect follow..*/..
38420 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
38430 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
38440 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
38450 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
38460 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
38470 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
38480 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
38490 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
384a0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
384b0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
384c0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
384d0 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
384e0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
384f0 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
38500 6c 75 65 0a 2a 2a 20