/ Hex Artifact Content
Login

Artifact 637fa969213812ba92f1f3c54e4be967bda60a13:


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 23 69 66 64 65 66 20 48 41 56 45 5f  if..#ifdef HAVE_
12c0: 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20  UTIME.# include 
12d0: 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66  <utime.h>.#endif
12e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
12f0: 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69  values of unixFi
1300: 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64  le.fsFlags.*/.#d
1310: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46  efine SQLITE_FSF
1320: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20  LAGS_IS_MSDOS   
1330: 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    0x1../*.** If 
1340: 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72  we are to be thr
1350: 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64  ead-safe, includ
1360: 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68  e the pthreads h
1370: 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65  eader and define
1380: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55  .** the SQLITE_U
1390: 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72  NIX_THREADS macr
13a0: 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
13b0: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e  _THREADSAFE.# in
13c0: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
13d0: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
13e0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
13f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1400: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1410: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1420: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
1430: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1440: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
1450: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1460: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1470: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
1480: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
1490: 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d   ** Default perm
14a0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
14b0: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
14c0: 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66   dir. */.#ifndef
14d0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14e0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14f0: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1500: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
1510: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
1520: 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f  S 0755.#endif../
1530: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
1540: 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67  ported path-leng
1550: 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  th..*/.#define M
1560: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
1570: 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20  ./*.** Only set 
1580: 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66  the lastErrno if
1590: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
15a0: 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20  is a real error 
15b0: 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f  and not .** a no
15c0: 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65  rmal expected re
15d0: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
15e0: 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49  ITE_BUSY or SQLI
15f0: 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65  TE_OK.*/.#define
1600: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78   IS_LOCK_ERROR(x
1610: 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45  )  ((x != SQLITE
1620: 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51  _OK) && (x != SQ
1630: 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20  LITE_BUSY))../* 
1640: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1650: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69  ruct unixShm uni
1670: 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  xShm;           
1680: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1690: 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
16a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
16b0: 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e  t unixShmNode un
16c0: 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  ixShmNode;      
16d0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
16e0: 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79  y instance */.ty
16f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1700: 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49  xInodeInfo unixI
1710: 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41  nodeInfo;   /* A
1720: 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65  n i-node */.type
1730: 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55  def struct UnixU
1740: 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73  nusedFd UnixUnus
1750: 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20  edFd;     /* An 
1760: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1770: 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  riptor */../*.**
1780: 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65   Sometimes, afte
1790: 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  r a file handle 
17a0: 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c  is closed by SQL
17b0: 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65  ite, the file de
17c0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e  scriptor.** cann
17d0: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
17e0: 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65  ediately. In the
17f0: 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e  se cases, instan
1800: 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ces of the follo
1810: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
1820: 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74  e are used to st
1830: 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ore the file des
1840: 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61  criptor while wa
1850: 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20  iting for an.** 
1860: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65  opportunity to e
1870: 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72  ither close or r
1880: 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  euse it..*/.stru
1890: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
18a0: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
18d0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
18e0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
18f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1900: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
1910: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
1920: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
1930: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
1940: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1950: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1960: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1970: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1980: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1990: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
19a0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
19b0: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
19c0: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
19d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
19e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
19f0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
1a00: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
1a10: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
1a20: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
1a30: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
1a40: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1a50: 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49  entry */.  unixI
1a60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a80: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1a90: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1aa0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ad0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1ae0: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 3b   */.  int dirfd;
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1b10: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
1b20: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a   the directory *
1b30: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1b40: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1b60: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1b70: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1b80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
1b90: 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  trlFlags;       
1ba0: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1bb0: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1bc0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1bd0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1c00: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1c10: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1c20: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1c30: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1c40: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1c50: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1c60: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1c70: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1c90: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1ca0: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1cb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cd0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1ce0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1cf0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1d20: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1d30: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1d40: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d60: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1d70: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1d80: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1d90: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1da0: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1db0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1dd0: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1de0: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1df0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1e00: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1e10: 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
1e20: 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69  _APPLE__).  unsi
1e30: 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20  gned fsFlags;   
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c  /* cached detail
1e60: 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20  s from statfs() 
1e70: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
1e80: 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74 20 69  _VXWORKS.  int i
1e90: 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20  sDelete;        
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb0: 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73  * Delete on clos
1ec0: 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 73  e if true */.  s
1ed0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
1ee0: 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20  eId *pId;       
1ef0: 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c     /* Unique fil
1f00: 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  e ID */.#endif.#
1f10: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1f20: 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75  /* The next grou
1f30: 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61  p of variables a
1f40: 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b  re used to track
1f50: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1f60: 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  the.  ** transac
1f70: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20  tion counter in 
1f80: 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64  bytes 24-27 of d
1f90: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72  atabase files ar
1fa0: 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77  e updated.  ** w
1fb0: 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74  henever any part
1fc0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fd0: 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73   changes.  An as
1fe0: 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69  sertion fault wi
1ff0: 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66  ll.  ** occur if
2000: 20 61 20 66 69 6c 65 20 69 73 20 75 70 64 61 74   a file is updat
2010: 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20  ed without also 
2020: 75 70 64 61 74 69 6e 67 20 74 68 65 20 74 72 61  updating the tra
2030: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f  nsaction.  ** co
2040: 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73  unter.  This tes
2050: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f  t is made to avo
2060: 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20  id new problems 
2070: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20  similar to the. 
2080: 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65   ** one describe
2090: 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 38  d by ticket #358
20a0: 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67  4. .  */.  unsig
20b0: 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e  ned char transCn
20c0: 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75  trChng;   /* Tru
20d0: 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  e if the transac
20e0: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61  tion counter cha
20f0: 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nged */.  unsign
2100: 65 64 20 63 68 61 72 20 64 62 55 70 64 61 74 65  ed char dbUpdate
2110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2120: 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
2130: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
2140: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  anged */.  unsig
2150: 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61  ned char inNorma
2160: 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75  lWrite;   /* Tru
2170: 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  e if in a normal
2180: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
2190: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
21a0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
21b0: 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c  /* In test mode,
21c0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   increase the si
21d0: 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ze of this struc
21e0: 74 75 72 65 20 61 20 62 69 74 20 73 6f 20 74 68  ture a bit so th
21f0: 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c  at .  ** it is l
2200: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
2210: 74 72 75 63 74 20 43 72 61 73 68 46 69 6c 65 20  truct CrashFile 
2220: 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36  defined in test6
2230: 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  .c..  */.  char 
2240: 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65  aPadding[32];.#e
2250: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
2260: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
2270: 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63  r the unixFile.c
2280: 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b  trlFlags bitmask
2290: 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  :.*/.#define UNI
22a0: 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20 20  XFILE_EXCL      
22b0: 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43 6f    0x01     /* Co
22c0: 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f  nnections from o
22d0: 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20  ne process only 
22e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
22f0: 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20  ILE_RDONLY      
2300: 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  0x02     /* Conn
2310: 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f  ection is read o
2320: 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  nly */.#define U
2330: 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  NIXFILE_PERSIST_
2340: 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a 20  WAL 0x04     /* 
2350: 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d  Persistent WAL m
2360: 6f 64 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ode */../*.** In
2370: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
2380: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
2390: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
23a0: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
23b0: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44  mmon.h"../*.** D
23c0: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
23d0: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
23e0: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
23f0: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
2400: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
2410: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
2420: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
2430: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
2440: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
2450: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
2460: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
2470: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2480: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
2490: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
24a0: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
24b0: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
24c0: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
24d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
24e0: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
24f0: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
2500: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
2510: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
2520: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2530: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
2540: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2550: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
2560: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
2570: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
2580: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
2590: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66  ndif../*.** Diff
25a0: 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65  erent Unix syste
25b0: 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28  ms declare open(
25c0: 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77  ) in different w
25d0: 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a  ays.  Same use.*
25e0: 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  * open(const cha
25f0: 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20  r*,int,mode_t). 
2600: 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e   Others use open
2610: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
2620: 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69  ,...)..** The di
2630: 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f  fference is impo
2640: 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67  rtant when using
2650: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2660: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  e function..**.*
2670: 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61 79  * The safest way
2680: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
2690: 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20  e problem is to 
26a0: 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73 20  always use this 
26b0: 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68  wrapper.** which
26c0: 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65 20   always has the 
26d0: 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65  same well-define
26e0: 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  d interface..*/.
26f0: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
2700: 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  Open(const char 
2710: 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67  *zFile, int flag
2720: 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20  s, int mode){.  
2730: 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c  return open(zFil
2740: 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b  e, flags, mode);
2750: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  .}../*.** Many s
2760: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
2770: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
2780: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
2790: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
27a0: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
27b0: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
27c0: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
27d0: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
27e0: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
27f0: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
2800: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
2810: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
2820: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
2830: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
2840: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
2850: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
2860: 74 69 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f  tic struct unix_
2870: 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73  syscall {.  cons
2880: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
2890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
28a0: 65 20 6f 66 20 74 68 65 20 73 79 74 65 6d 20 63  e of the sytem c
28b0: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
28c0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75  _syscall_ptr pCu
28d0: 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e  rrent; /* Curren
28e0: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  t value of the s
28f0: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
2900: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2910: 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a  ptr pDefault; /*
2920: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   Default value *
2930: 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d  /.} aSyscall[] =
2940: 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20   {.  { "open",  
2950: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2960: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69  syscall_ptr)posi
2970: 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64  xOpen,  0  },.#d
2980: 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20  efine osOpen    
2990: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
29a0: 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29   char*,int,int))
29b0: 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72  aSyscall[0].pCur
29c0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73  rent)..  { "clos
29d0: 65 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  e",        (sqli
29e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
29f0: 63 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d  close,      0  }
2a00: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73  ,.#define osClos
2a10: 65 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  e     ((int(*)(i
2a20: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e  nt))aSyscall[1].
2a30: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2a40: 61 63 63 65 73 73 22 2c 20 20 20 20 20 20 20 28  access",       (
2a50: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2a60: 70 74 72 29 61 63 63 65 73 73 2c 20 20 20 20 20  ptr)access,     
2a70: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2a80: 41 63 63 65 73 73 20 20 20 20 28 28 69 6e 74 28  Access    ((int(
2a90: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
2aa0: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e  nt))aSyscall[2].
2ab0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2ac0: 67 65 74 63 77 64 22 2c 20 20 20 20 20 20 20 28  getcwd",       (
2ad0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2ae0: 70 74 72 29 67 65 74 63 77 64 2c 20 20 20 20 20  ptr)getcwd,     
2af0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2b00: 47 65 74 63 77 64 20 20 20 20 28 28 63 68 61 72  Getcwd    ((char
2b10: 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f  *(*)(char*,size_
2b20: 74 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70  t))aSyscall[3].p
2b30: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73  Current)..  { "s
2b40: 74 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73  tat",         (s
2b50: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2b60: 74 72 29 73 74 61 74 2c 20 20 20 20 20 20 20 30  tr)stat,       0
2b70: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53    },.#define osS
2b80: 74 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a  tat      ((int(*
2b90: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74  )(const char*,st
2ba0: 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73  ruct stat*))aSys
2bb0: 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74  call[4].pCurrent
2bc0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47  )../*.** The DJG
2bd0: 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69  PP compiler envi
2be0: 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f  ronment looks mo
2bf0: 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20  stly like Unix, 
2c00: 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20  but it.** lacks 
2c10: 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74  the fcntl() syst
2c20: 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64  em call.  So red
2c30: 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f  efine fcntl() to
2c40: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   be something.**
2c50: 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63   that always suc
2c60: 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61  ceeds.  This mea
2c70: 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20  ns that locking 
2c80: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
2c90: 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20  nder.** DJGPP.  
2ca0: 42 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20  But it is DOS - 
2cb0: 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70  what did you exp
2cc0: 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  ect?.*/.#ifdef _
2cd0: 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73  _DJGPP__.  { "fs
2ce0: 74 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20  tat",        0, 
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2d10: 46 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20  Fstat(a,b,c)    
2d20: 30 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b  0.#else     .  {
2d30: 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20   "fstat",       
2d40: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2d50: 6c 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20 20  l_ptr)fstat,    
2d60: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2d70: 6f 73 46 73 74 61 74 20 20 20 20 20 28 28 69 6e  osFstat     ((in
2d80: 74 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20  t(*)(int,struct 
2d90: 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  stat*))aSyscall[
2da0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  5].pCurrent).#en
2db0: 64 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63  dif..  { "ftrunc
2dc0: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
2dd0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74  3_syscall_ptr)ft
2de0: 72 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a  runcate,  0  },.
2df0: 23 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63  #define osFtrunc
2e00: 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74  ate ((int(*)(int
2e10: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
2e20: 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [6].pCurrent).. 
2e30: 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20   { "fcntl",     
2e40: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2e50: 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20  all_ptr)fcntl,  
2e60: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2e70: 65 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28  e osFcntl     ((
2e80: 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e  int(*)(int,int,.
2e90: 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e  ..))aSyscall[7].
2ea0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2eb0: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 20 28  read",         (
2ec0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2ed0: 70 74 72 29 72 65 61 64 2c 20 20 20 20 20 20 20  ptr)read,       
2ee0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2ef0: 52 65 61 64 20 20 20 20 20 20 28 28 73 73 69 7a  Read      ((ssiz
2f00: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
2f10: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
2f20: 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[8].pCurrent)..
2f30: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
2f40: 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45  PREAD) || SQLITE
2f50: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2f60: 53 54 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64  STYLE.  { "pread
2f70: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
2f80: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
2f90: 72 65 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c  read,      0  },
2fa0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61  .#else.  { "prea
2fb0: 64 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  d",        (sqli
2fc0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2fd0: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
2fe0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
2ff0: 20 6f 73 50 72 65 61 64 20 20 20 20 20 28 28 73   osPread     ((s
3000: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
3010: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3020: 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43  ))aSyscall[9].pC
3030: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3040: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
3050: 29 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c  ).  { "pread64",
3060: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3070: 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64  yscall_ptr)pread
3080: 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  64,    0  },.#el
3090: 73 65 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22  se.  { "pread64"
30a0: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
30b0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
30c0: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
30d0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
30e0: 72 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65  read64   ((ssize
30f0: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
3100: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
3110: 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72  yscall[10].pCurr
3120: 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65  ent)..  { "write
3130: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
3140: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77  e3_syscall_ptr)w
3150: 72 69 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c  rite,      0  },
3160: 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65  .#define osWrite
3170: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3180: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
3190: 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61  *,size_t))aSysca
31a0: 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[11].pCurrent)
31b0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
31c0: 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49  E_PREAD) || SQLI
31d0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
31e0: 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72  G_STYLE.  { "pwr
31f0: 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ite",       (sql
3200: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3210: 29 70 77 72 69 74 65 2c 20 20 20 20 20 30 20 20  )pwrite,     0  
3220: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77  },.#else.  { "pw
3230: 72 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71  rite",       (sq
3240: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3250: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
3260: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
3270: 6e 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28  ne osPwrite    (
3280: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
3290: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65  const void*,size
32a0: 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20  _t,off_t))\.    
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75  aSyscall[12].pCu
32d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
32e0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
32f0: 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c  .  { "pwrite64",
3300: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3310: 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65  scall_ptr)pwrite
3320: 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  64,   0  },.#els
3330: 65 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22  e.  { "pwrite64"
3340: 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ,     (sqlite3_s
3350: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3360: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3370: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77  dif.#define osPw
3380: 72 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f  rite64  ((ssize_
3390: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
33a0: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
33b0: 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  t))\.           
33c0: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
33d0: 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[13].pCurrent).
33e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
33f0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
3400: 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20  .  { "fchmod",  
3410: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3420: 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64  scall_ptr)fchmod
3430: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  ,     0  },.#els
3440: 65 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20  e.  { "fchmod", 
3450: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3460: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3470: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3480: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  dif.#define osFc
3490: 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28 2a 29  hmod    ((int(*)
34a0: 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79  (int,mode_t))aSy
34b0: 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65  scall[14].pCurre
34c0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
34d0: 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c  (HAVE_POSIX_FALL
34e0: 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50  OCATE) && HAVE_P
34f0: 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20  OSIX_FALLOCATE. 
3500: 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20   { "fallocate", 
3510: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3520: 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f 66 61  all_ptr)posix_fa
3530: 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23  llocate,  0 },.#
3540: 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  else.  { "falloc
3550: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
3560: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3580: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
3590: 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20  ine osFallocate 
35a0: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66  ((int(*)(int,off
35b0: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
35c0: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
35d0: 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ..}; /* End of t
35e0: 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  he overrideable 
35f0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a  system calls */.
3600: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
3610: 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  he xSetSystemCal
3620: 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71  l() method of sq
3630: 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c  lite3_vfs for al
3640: 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69  l of the.** "uni
3650: 78 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72  x" VFSes.  Retur
3660: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e  n SQLITE_OK opon
3670: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70   successfully up
3680: 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79  dating the.** sy
3690: 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65  stem call pointe
36a0: 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54  r, or SQLITE_NOT
36b0: 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69  FOUND if there i
36c0: 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c  s no configurabl
36d0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
36e0: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f   named zName..*/
36f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
3700: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  SetSystemCall(. 
3710: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
3720: 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f  otUsed,        /
3730: 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65  * The VFS pointe
3740: 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a  r.  Not used */.
3750: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
3760: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
3770: 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65  /* Name of syste
3780: 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69  m call to overri
3790: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
37a0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77  syscall_ptr pNew
37b0: 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72  Func  /* Pointer
37c0: 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63   to new system c
37d0: 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  all value */.){.
37e0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
37f0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3800: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20  ITE_NOTFOUND;.. 
3810: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
3820: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  R(pNotUsed);.  i
3830: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
3840: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d     /* If no zNam
3850: 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74  e is given, rest
3860: 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63  ore all system c
3870: 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65  alls to their de
3880: 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74  fault.    ** set
3890: 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e  tings and return
38a0: 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20   NULL.    */.   
38b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
38c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
38d0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
38e0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
38f0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
3900: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
3910: 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  ].pDefault ){.  
3920: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
3930: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79  ].pCurrent = aSy
3940: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
3950: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
3960: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
3970: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65   If zName is spe
3980: 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20  cified, operate 
3990: 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20  on only the one 
39a0: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20  system call.    
39b0: 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  ** specified..  
39c0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
39d0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
39e0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
39f0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
3a00: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
3a10: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
3a20: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
3a30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79  .        if( aSy
3a40: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
3a50: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
3a60: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44    aSyscall[i].pD
3a70: 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c  efault = aSyscal
3a80: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
3a90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3aa0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3ab0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
3ac0: 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46  wFunc==0 ) pNewF
3ad0: 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  unc = aSyscall[i
3ae0: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  ].pDefault;.    
3af0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
3b00: 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46  pCurrent = pNewF
3b10: 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  unc;.        bre
3b20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3b30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
3b40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
3b50: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
3b60: 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  a system call.  
3b70: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
3b80: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  Name is not a.**
3b90: 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74   recognized syst
3ba0: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e  em call name.  N
3bb0: 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75  ULL is also retu
3bc0: 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74  rned if the syst
3bd0: 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75  em call.** is cu
3be0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65  rrently undefine
3bf0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  d..*/.static sql
3c00: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3c10: 20 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61   unixGetSystemCa
3c20: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
3c30: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63  s *pNotUsed,.  c
3c40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3c50: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
3c60: 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  nt i;..  UNUSED_
3c70: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
3c80: 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ed);.  for(i=0; 
3c90: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
3ca0: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
3cb0: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
3cc0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
3cd0: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
3ce0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
3cf0: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  rn aSyscall[i].p
3d00: 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72  Current;.  }.  r
3d10: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
3d20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
3d30: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  e of the first s
3d40: 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72  ystem call after
3d50: 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d   zName.  If zNam
3d60: 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  e==NULL.** then 
3d70: 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  return the name 
3d80: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
3d90: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
3da0: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a  n NULL if zName.
3db0: 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73  ** is the last s
3dc0: 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66  ystem call or if
3dd0: 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68   zName is not th
3de0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69  e name of a vali
3df0: 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  d.** system call
3e00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
3e10: 74 20 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74  t char *unixNext
3e20: 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74  SystemCall(sqlit
3e30: 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74  e3_vfs *p, const
3e40: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
3e50: 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20   int i = -1;..  
3e60: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3e70: 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  (p);.  if( zName
3e80: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
3e90: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79   i<ArraySize(aSy
3ea0: 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a  scall)-1; i++){.
3eb0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
3ec0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
3ed0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
3ee0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
3ef0: 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72  .  for(i++; i<Ar
3f00: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
3f10: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
3f20: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
3f30: 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72  rrent!=0 ) retur
3f40: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  n aSyscall[i].zN
3f50: 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ame;.  }.  retur
3f60: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
3f70: 74 72 79 20 6f 70 65 6e 28 29 20 63 61 6c 6c 73  try open() calls
3f80: 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74   that fail due t
3f90: 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69  o EINTR.*/.stati
3fa0: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65  c int robust_ope
3fb0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
3fc0: 20 69 6e 74 20 66 2c 20 69 6e 74 20 6d 29 7b 0a   int f, int m){.
3fd0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20    int rc;.  do{ 
3fe0: 72 63 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c  rc = osOpen(z,f,
3ff0: 6d 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  m); }while( rc<0
4000: 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
4010: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
4020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  .}../*.** Helper
4030: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
4040: 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
4050: 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
4060: 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f  utex. The.** glo
4070: 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65  bal mutex is use
4080: 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65  d to protect the
4090: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61   unixInodeInfo a
40a0: 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c  nd.** vxworksFil
40b0: 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64  eId objects used
40c0: 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61   by this file, a
40d0: 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
40e0: 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79  be .** shared by
40f0: 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
4100: 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
4110: 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  n unixMutexHeld(
4120: 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73  ) is used to ass
4130: 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67  ert() that the g
4140: 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20  lobal mutex .** 
4150: 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
4160: 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
4170: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
4180: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
4190: 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
41a0: 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
41b0: 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
41c0: 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
41d0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
41e0: 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45  () );.**   unixE
41f0: 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73  nterLeave().*/.s
4200: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45  tatic void unixE
4210: 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
4220: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4230: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
4240: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
4250: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
4260: 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
4270: 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75  void unixLeaveMu
4280: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
4290: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
42a0: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
42b0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
42c0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
42d0: 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
42e0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
42f0: 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  t unixMutexHeld(
4300: 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
4310: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
4320: 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78  eld(sqlite3Mutex
4330: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
4340: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
4350: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  ));.}.#endif...#
4360: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4370: 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  UG./*.** Helper 
4380: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69  function for pri
4390: 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20  nting out trace 
43a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
43b0: 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69   debugging.** bi
43c0: 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74  naries. This ret
43d0: 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20  urns the string 
43e0: 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66  represetation of
43f0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a   the supplied.**
4400: 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79   integer lock-ty
4410: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  pe..*/.static co
4420: 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65  nst char *azFile
4430: 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f  Lock(int eFileLo
4440: 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65  ck){.  switch( e
4450: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
4460: 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65  case NO_LOCK: re
4470: 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20  turn "NONE";.   
4480: 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43   case SHARED_LOC
4490: 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45  K: return "SHARE
44a0: 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53  D";.    case RES
44b0: 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  ERVED_LOCK: retu
44c0: 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20  rn "RESERVED";. 
44d0: 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f     case PENDING_
44e0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45  LOCK: return "PE
44f0: 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65  NDING";.    case
4500: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
4510: 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49   return "EXCLUSI
4520: 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VE";.  }.  retur
4530: 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e  n "ERROR";.}.#en
4540: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4550: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a  TE_LOCK_TRACE./*
4560: 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e  .** Print out in
4570: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4580: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  all locking oper
4590: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
45a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
45b0: 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  ed for troublesh
45c0: 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ooting locks on 
45d0: 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a  multithreaded.**
45e0: 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61   platforms.  Ena
45f0: 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67  ble by compiling
4600: 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49   with the -DSQLI
4610: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a  TE_LOCK_TRACE.**
4620: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
4630: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70  tion on the comp
4640: 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65  iler.  This code
4650: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20   is normally.** 
4660: 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73  turned off..*/.s
4670: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72  tatic int lockTr
4680: 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ace(int fd, int 
4690: 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  op, struct flock
46a0: 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f   *p){.  char *zO
46b0: 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20  pName, *zType;. 
46c0: 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61   int s;.  int sa
46d0: 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20  vedErrno;.  if( 
46e0: 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20  op==F_GETLK ){. 
46f0: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45     zOpName = "GE
4700: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TLK";.  }else if
4710: 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b  ( op==F_SETLK ){
4720: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
4730: 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  SETLK";.  }else{
4740: 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c  .    s = osFcntl
4750: 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20  (fd, op, p);.   
4760: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
4770: 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f  ntf("fcntl unkno
4780: 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20  wn %d %d %d\n", 
4790: 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20  fd, op, s);.    
47a0: 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20  return s;.  }.  
47b0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
47c0: 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _RDLCK ){.    zT
47d0: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
47e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
47f0: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
4800: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52  .    zType = "WR
4810: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
4820: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( p->l_type==F_U
4830: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  NLCK ){.    zTyp
4840: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d  e = "UNLCK";.  }
4850: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
4860: 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ( 0 );.  }.  ass
4870: 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65  ert( p->l_whence
4880: 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20  ==SEEK_SET );.  
4890: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  s = osFcntl(fd, 
48a0: 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45  op, p);.  savedE
48b0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
48c0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
48d0: 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20  tf("fcntl %d %d 
48e0: 25 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25  %s %s %d %d %d %
48f0: 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61  d\n",.     threa
4900: 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65  did, fd, zOpName
4910: 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d  , zType, (int)p-
4920: 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70  >l_start, (int)p
4930: 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69  ->l_len,.     (i
4940: 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b  nt)p->l_pid, s);
4950: 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26  .  if( s==(-1) &
4960: 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26  & op==F_SETLK &&
4970: 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52   (p->l_type==F_R
4980: 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70  DLCK || p->l_typ
4990: 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20  e==F_WRLCK) ){. 
49a0: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
49b0: 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b  l2;.    l2 = *p;
49c0: 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c  .    osFcntl(fd,
49d0: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a   F_GETLK, &l2);.
49e0: 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70      if( l2.l_typ
49f0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
4a00: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
4a10: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  CK";.    }else i
4a20: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
4a30: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  WRLCK ){.      z
4a40: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
4a50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
4a60: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  .l_type==F_UNLCK
4a70: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
4a80: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "UNLCK";.    }
4a90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
4aa0: 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20  rt( 0 );.    }. 
4ab0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
4ac0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69  rintf("fcntl-fai
4ad0: 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20  lure-reason: %s 
4ae0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
4af0: 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29      zType, (int)
4b00: 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  l2.l_start, (int
4b10: 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29  )l2.l_len, (int)
4b20: 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20  l2.l_pid);.  }. 
4b30: 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72   errno = savedEr
4b40: 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b  rno;.  return s;
4b50: 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74  .}.#undef osFcnt
4b60: 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  l.#define osFcnt
4b70: 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64  l lockTrace.#end
4b80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  if /* SQLITE_LOC
4b90: 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  K_TRACE */../*.*
4ba0: 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74  * Retry ftruncat
4bb0: 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  e() calls that f
4bc0: 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52  ail due to EINTR
4bd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
4be0: 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
4bf0: 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69  int h, sqlite3_i
4c00: 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20  nt64 sz){.  int 
4c10: 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f  rc;.  do{ rc = o
4c20: 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a 29  sFtruncate(h,sz)
4c30: 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
4c40: 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
4c50: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4c60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4c70: 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20  tine translates 
4c80: 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58  a standard POSIX
4c90: 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f   errno code into
4ca0: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73   something.** us
4cb0: 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65  eful to the clie
4cc0: 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  nts of the sqlit
4cd0: 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53  e3 functions.  S
4ce0: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20  pecifically, it 
4cf0: 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74  is.** intended t
4d00: 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61  o translate a va
4d10: 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61 67  riety of "try ag
4d20: 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  ain" errors into
4d30: 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20   SQLITE_BUSY.** 
4d40: 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f 66  and a variety of
4d50: 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74   "please close t
4d60: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
4d70: 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69  or NOW" errors i
4d80: 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49  nto .** SQLITE_I
4d90: 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f  OERR.** .** Erro
4da0: 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  rs during initia
4db0: 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b  lization of lock
4dc0: 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65  s, or file syste
4dd0: 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f  m support for lo
4de0: 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68  cks,.** should h
4df0: 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e  andle ENOLCK, EN
4e00: 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50  OTSUP, EOPNOTSUP
4e10: 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f  P separately..*/
4e20: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4e30: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
4e40: 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45  Error(int posixE
4e50: 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65  rror, int sqlite
4e60: 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74 63  IOErr) {.  switc
4e70: 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b  h (posixError) {
4e80: 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f  .#if 0.  /* At o
4e90: 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 63 6f  ne point this co
4ea0: 64 65 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65  de was not comme
4eb0: 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20 74 68 65  nted out. In the
4ec0: 6f 72 79 2c 20 74 68 69 73 20 62 72 61 6e 63 68  ory, this branch
4ed0: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76  .  ** should nev
4ee0: 65 72 20 62 65 20 68 69 74 2c 20 61 73 20 74 68  er be hit, as th
4ef0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
4f00: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
4f10: 64 20 61 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c  d after.  ** a l
4f20: 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65 64 20 66  ocking-related f
4f30: 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63  unction (i.e. fc
4f40: 6e 74 6c 28 29 29 20 68 61 73 20 72 65 74 75 72  ntl()) has retur
4f50: 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74  ned non-zero wit
4f60: 68 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65  h.  ** the value
4f70: 20 6f 66 20 65 72 72 6e 6f 20 61 73 20 74 68 65   of errno as the
4f80: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4f90: 20 53 69 6e 63 65 20 61 20 73 79 73 74 65 6d 20   Since a system 
4fa0: 63 61 6c 6c 20 68 61 73 20 66 61 69 6c 65 64 2c  call has failed,
4fb0: 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75  .  ** errno shou
4fc0: 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  ld be non-zero..
4fd0: 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74    **.  ** Despit
4fe0: 65 20 74 68 69 73 2c 20 69 66 20 65 72 72 6e 6f  e this, if errno
4ff0: 20 72 65 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c   really is zero,
5000: 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20   we still don't 
5010: 77 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 0a 20  want to return. 
5020: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54   ** SQLITE_OK. T
5030: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 66  he system call f
5040: 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65  ailed, and *some
5050: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 73  * SQLite error s
5060: 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72  hould be.  ** pr
5070: 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20 74 6f  opagated back to
5080: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d   the caller. Com
5090: 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 62 72 61  menting this bra
50a0: 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73 20 65 72  nch out means er
50b0: 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c  rno==0.  ** will
50c0: 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
50d0: 68 65 20 22 64 65 66 61 75 6c 74 3a 22 20 63 61  he "default:" ca
50e0: 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  se below..  */. 
50f0: 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72 65   case 0: .    re
5100: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5110: 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65 20 45  #endif..  case E
5120: 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54  AGAIN:.  case ET
5130: 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20  IMEDOUT:.  case 
5140: 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49  EBUSY:.  case EI
5150: 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c  NTR:.  case ENOL
5160: 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e  CK:  .    /* ran
5170: 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72  dom NFS retry er
5180: 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  ror, unless duri
5190: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
51a0: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
51b0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
51c0: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
51d0: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
51e0: 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74   says */.    ret
51f0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
5200: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43  .    .  case EAC
5210: 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43  CES: .    /* EAC
5220: 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41  CES is like EAGA
5230: 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e  IN during lockin
5240: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75  g operations, bu
5250: 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20  t not any other 
5260: 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28  time*/.    if( (
5270: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
5280: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
5290: 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f  ) || ..(sqliteIO
52a0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
52b0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
52c0: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
52d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
52e0: 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74  LOCK) ||..(sqlit
52f0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
5300: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
5310: 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  RVEDLOCK) ){.   
5320: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5330: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
5340: 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68   /* else fall th
5350: 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20  rough */.  case 
5360: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
5370: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
5380: 20 20 20 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c      .  /* EDEADL
5390: 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  K is only possib
53a0: 6c 65 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  le if a call to 
53b0: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20  fcntl(F_SETLKW) 
53c0: 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a  is made. And.  *
53d0: 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65  * this module ne
53e0: 76 65 72 20 6d 61 6b 65 73 20 73 75 63 68 20 61  ver makes such a
53f0: 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63   call. And the c
5400: 6f 64 65 20 69 6e 20 53 51 4c 69 74 65 20 69 74  ode in SQLite it
5410: 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73 65 72  self .  ** asser
5420: 74 73 20 74 68 61 74 20 53 51 4c 49 54 45 5f 49  ts that SQLITE_I
5430: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20  OERR_BLOCKED is 
5440: 6e 65 76 65 72 20 72 65 74 75 72 6e 65 64 2e 20  never returned. 
5450: 46 6f 72 20 74 68 65 73 65 20 72 65 61 73 6f 6e  For these reason
5460: 73 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65  s.  ** this case
5470: 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74   is also comment
5480: 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65 20 73  ed out. If the s
5490: 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74 20 65  ystem does set e
54a0: 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c  rrno to EDEADLK,
54b0: 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  .  ** the defaul
54c0: 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  t SQLITE_IOERR_X
54d0: 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  XX code will be 
54e0: 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66  returned. */.#if
54f0: 20 30 0a 20 20 63 61 73 65 20 45 44 45 41 44 4c   0.  case EDEADL
5500: 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K:.    return SQ
5510: 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
5520: 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a  ED;.#endif.    .
5530: 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d  #if EOPNOTSUPP!=
5540: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
5550: 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20  OPNOTSUPP: .    
5560: 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e  /* something wen
5570: 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c  t terribly awry,
5580: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
5590: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
55a0: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
55b0: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
55c0: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
55d0: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
55e0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  s */.#endif.#ifd
55f0: 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  ef ENOTSUP.  cas
5600: 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20  e ENOTSUP: .    
5610: 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75  /* invalid fd, u
5620: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
5630: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
5640: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
5650: 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a  in which .     *
5660: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
5670: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
5680: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65  */.#endif.  case
5690: 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41   EIO:.  case EBA
56a0: 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41  DF:.  case EINVA
56b0: 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f  L:.  case ENOTCO
56c0: 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45  NN:.  case ENODE
56d0: 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a  V:.  case ENXIO:
56e0: 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a  .  case ENOENT:.
56f0: 23 69 66 64 65 66 20 45 53 54 41 4c 45 20 20 20  #ifdef ESTALE   
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73 20 6e    /* ESTALE is n
5720: 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e  ot defined on In
5730: 74 65 72 69 78 20 73 79 73 74 65 6d 73 20 2a 2f  terix systems */
5740: 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a  .  case ESTALE:.
5750: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 4e  #endif.  case EN
5760: 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65  OSYS:.    /* the
5770: 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20  se should force 
5780: 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c  the client to cl
5790: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
57a0: 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20   reconnect */.  
57b0: 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20    .  default: . 
57c0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
57d0: 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a  IOErr;.  }.}....
57e0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
57f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
5830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5840: 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20  ** Begin Unique 
5850: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
5860: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
5870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
5880: 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65  **.** On most ve
5890: 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20  rsions of unix, 
58a0: 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69  we can get a uni
58b0: 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c  que ID for a fil
58c0: 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69  e by concatenati
58d0: 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65  ng.** the device
58e0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
58f0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42  inode number.  B
5900: 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ut this does not
5910: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
5920: 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c  ..** On VxWorks,
5930: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69   a unique file i
5940: 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20  d must be based 
5950: 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  on the canonical
5960: 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a   filename..**.**
5970: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   A pointer to an
5980: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
5990: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
59a0: 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  ture can be used
59b0: 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20   as a.** unique 
59c0: 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72  file ID in VxWor
59d0: 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e  ks.  Each instan
59e0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
59f0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
5a00: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
5a10: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
5a20: 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73  e.  There is als
5a30: 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  o a reference co
5a40: 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74  unt.  .** The st
5a50: 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61  ructure is recla
5a60: 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  imed when the nu
5a70: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
5a80: 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a   to it drops to.
5a90: 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  ** zero..**.** T
5aa0: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76  here are never v
5ab0: 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f  ery many files o
5ac0: 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20  pen at one time 
5ad0: 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20  and lookups are 
5ae0: 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d  not.** a perform
5af0: 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61  ance-critical pa
5b00: 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66  th, so it is suf
5b10: 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74  ficient to put t
5b20: 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  hese.** structur
5b30: 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  es on a linked l
5b40: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76  ist..*/.struct v
5b50: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20  xworksFileId {. 
5b60: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
5b70: 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f  ileId *pNext;  /
5b80: 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74  * Next in a list
5b90: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
5ba0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
5bd0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
5be0: 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  one */.  int nNa
5bf0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
5c00: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
5c10: 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63   of the zCanonic
5c20: 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20  alName[] string 
5c30: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f  */.  char *zCano
5c40: 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20  nicalName;      
5c50: 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20     /* Canonical 
5c60: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a  filename */.};..
5c70: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
5c80: 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65  * .** All unique
5c90: 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68   filenames are h
5ca0: 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  eld on a linked 
5cb0: 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74  list headed by t
5cc0: 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a  his.** variable:
5cd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
5ce0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
5cf0: 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  *vxworksFileList
5d00: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d   = 0;../*.** Sim
5d10: 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65  plify a filename
5d20: 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69   into its canoni
5d30: 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d  cal form.** by m
5d40: 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  aking the follow
5d50: 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a  ing changes:.**.
5d60: 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61  **  * removing a
5d70: 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20  ny trailing and 
5d80: 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20  duplicate /.**  
5d90: 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e  * convert /./ in
5da0: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20  to just /.**  * 
5db0: 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77  convert /A/../ w
5dc0: 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69  here A is any si
5dd0: 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a  mple name into j
5de0: 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  ust /.**.** Chan
5df0: 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d  ges are made in-
5e00: 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74  place.  Return t
5e10: 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67  he new name leng
5e20: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  th..**.** The or
5e30: 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
5e40: 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e  is in z[0..n-1].
5e50: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
5e60: 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  ber of.** charac
5e70: 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70  ters in the simp
5e80: 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a  lified name..*/.
5e90: 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72  static int vxwor
5ea0: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63  ksSimplifyName(c
5eb0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
5ec0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68    int i, j;.  wh
5ed0: 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d  ile( n>1 && z[n-
5ee0: 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20  1]=='/' ){ n--; 
5ef0: 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  }.  for(i=j=0; i
5f00: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <n; i++){.    if
5f10: 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ( z[i]=='/' ){. 
5f20: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
5f30: 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='/' ) continue;
5f40: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
5f50: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20  ]=='.' && i+2<n 
5f60: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29  && z[i+2]=='/' )
5f70: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31  {.        i += 1
5f80: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
5f90: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
5fa0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
5fb0: 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b  ' && i+3<n && z[
5fc0: 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69  i+2]=='.' && z[i
5fd0: 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +3]=='/' ){.    
5fe0: 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
5ff0: 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b  & z[j-1]!='/' ){
6000: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
6010: 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20  if( j>0 ){ j--; 
6020: 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  }.        i += 2
6030: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
6040: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
6050: 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a  }.    z[j++] = z
6060: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  [i];.  }.  z[j] 
6070: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b  = 0;.  return j;
6080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
6090: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
60a0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62  for the given ab
60b0: 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e  solute pathname.
60c0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
60d0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77  inter to the vxw
60e0: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
60f0: 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72  t.  This pointer
6100: 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a   is the unique.*
6110: 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a  * file ID..**.**
6120: 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20   The nRef field 
6130: 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  of the vxworksFi
6140: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69  leId object is i
6150: 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72  ncremented befor
6160: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
6170: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20  is returned.  A 
6180: 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  new vxworksFileI
6190: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  d object is crea
61a0: 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64  ted.** and added
61b0: 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c   to the global l
61c0: 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79  ist if necessary
61d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
61e0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
61f0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
6200: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
6210: 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72  tic struct vxwor
6220: 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b  ksFileId *vxwork
6230: 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73  sFindFileId(cons
6240: 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74  t char *zAbsolut
6250: 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74  eName){.  struct
6260: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
6270: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a  pNew;         /*
6280: 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20   search key and 
6290: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
62a0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
62b0: 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74  ileId *pCandidat
62c0: 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  e;   /* For loop
62d0: 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e  ing over existin
62e0: 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20  g file IDs */.  
62f0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6310: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
6320: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73   zAbsoluteName s
6330: 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65  tring */..  asse
6340: 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  rt( zAbsoluteNam
6350: 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e  e[0]=='/' );.  n
6360: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
6370: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20  AbsoluteName);. 
6380: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
6390: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
63a0: 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b  pNew) + (n+1) );
63b0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
63c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
63d0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
63e0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
63f0: 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  [1];.  memcpy(pN
6400: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
6410: 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  me, zAbsoluteNam
6420: 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76  e, n+1);.  n = v
6430: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
6440: 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  me(pNew->zCanoni
6450: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20  calName, n);..  
6460: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
6470: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
6480: 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68  that matching th
6490: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65  e canonical name
64a0: 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c  ..  ** If found,
64b0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
64c0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61  eference count a
64d0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
64e0: 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ter to.  ** the 
64f0: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
6500: 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
6510: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
6520: 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f  (pCandidate=vxwo
6530: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61  rksFileList; pCa
6540: 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64  ndidate; pCandid
6550: 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e  ate=pCandidate->
6560: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
6570: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d  pCandidate->nNam
6580: 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65  e==n .     && me
6590: 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d  mcmp(pCandidate-
65a0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
65b0: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
65c0: 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20  lName, n)==0.   
65d0: 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
65e0: 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
65f0: 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65        pCandidate
6600: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
6610: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
6620: 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
6630: 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20   pCandidate;.   
6640: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20   }.  }..  /* No 
6650: 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e  match was found.
6660: 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61    We will make a
6670: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
6680: 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
6690: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20  ;.  pNew->nName 
66a0: 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = n;.  pNew->pNe
66b0: 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65  xt = vxworksFile
66c0: 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46  List;.  vxworksF
66d0: 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  ileList = pNew;.
66e0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
66f0: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ();.  return pNe
6700: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  w;.}../*.** Decr
6710: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
6720: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76  nce count on a v
6730: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
6740: 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68  ect.  Free.** th
6750: 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68  e object when th
6760: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
6770: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a  t reaches zero..
6780: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
6790: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
67a0: 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72  eId(struct vxwor
67b0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a  ksFileId *pId){.
67c0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
67d0: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ();.  assert( pI
67e0: 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  d->nRef>0 );.  p
67f0: 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Id->nRef--;.  if
6800: 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pId->nRef==0 )
6810: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77  {.    struct vxw
6820: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b  orksFileId **pp;
6830: 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77  .    for(pp=&vxw
6840: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70  orksFileList; *p
6850: 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70  p && *pp!=pId; p
6860: 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65  p = &((*pp)->pNe
6870: 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72  xt)){}.    asser
6880: 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20  t( *pp==pId );. 
6890: 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e     *pp = pId->pN
68a0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
68b0: 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a  _free(pId);.  }.
68c0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
68d0: 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ();.}.#endif /* 
68e0: 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
68f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
6900: 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c  nd of Unique Fil
6910: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
6920: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
6930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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: 2a 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 2a 2a 2a 2a  ****************
6980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
6990: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
69a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
69e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69  *********** Posi
6a00: 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
6a10: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
6a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
6a30: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69  **.** POSIX advi
6a40: 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62  sory locks are b
6a50: 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e  roken by design.
6a60: 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e    ANSI STD 1003.
6a70: 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74  1 (1996).** sect
6a80: 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65  ion 6.5.2.2 line
6a90: 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39  s 483 through 49
6aa0: 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77  0 specify that w
6ab0: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a  hen a process.**
6ac0: 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20   sets or clears 
6ad0: 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65  a lock, that ope
6ae0: 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73  ration overrides
6af0: 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73   any prior locks
6b00: 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73   set.** by the s
6b10: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74  ame process.  It
6b20: 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
6b30: 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74  itly say so, but
6b40: 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a   this implies.**
6b50: 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64   that it overrid
6b60: 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20  es locks set by 
6b70: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
6b80: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
6b90: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
6ba0: 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72  iptor.  Consider
6bb0: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a   this test case:
6bc0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  .**.**       int
6bd0: 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd1 = open("./f
6be0: 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile1", O_RDWR|O_
6bf0: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
6c00: 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d         int fd2 =
6c10: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c   open("./file2",
6c20: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
6c30: 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75   0644);.**.** Su
6c40: 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e  ppose ./file1 an
6c50: 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65  d ./file2 are re
6c60: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69  ally the same fi
6c70: 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f  le (because.** o
6c80: 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20  ne is a hard or 
6c90: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f  symbolic link to
6ca0: 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e   the other) then
6cb0: 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61   if you set.** a
6cc0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
6cd0: 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72   on fd1, then tr
6ce0: 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c  y to get an excl
6cf0: 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  usive lock.** on
6d00: 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20   fd2, it works. 
6d10: 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78   I would have ex
6d20: 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e  pected the secon
6d30: 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69  d lock to.** fai
6d40: 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61  l since there wa
6d50: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
6d60: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65   on the file due
6d70: 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20   to fd1..** But 
6d80: 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62  not so.  Since b
6d90: 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66  oth locks came f
6da0: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f  rom the same pro
6db0: 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63  cess, the.** sec
6dc0: 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68  ond overrides th
6dd0: 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68  e first, even th
6de0: 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f  ough they were o
6df0: 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  n different.** f
6e00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
6e10: 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72  opened on differ
6e20: 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a  ent file names..
6e30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  **.** This means
6e40: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
6e50: 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  use POSIX locks 
6e60: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66  to synchronize f
6e70: 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d  ile access.** am
6e80: 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68  ong competing th
6e90: 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d  reads of the sam
6ea0: 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49  e process.  POSI
6eb0: 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72  X locks will wor
6ec0: 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e  k fine.** to syn
6ed0: 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20  chronize access 
6ee0: 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73  for threads in s
6ef0: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
6f00: 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68  s, but not.** th
6f10: 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65  reads within the
6f20: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a   same process..*
6f30: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
6f40: 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  und the problem,
6f50: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d   SQLite has to m
6f60: 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73  anage file locks
6f70: 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f   internally.** o
6f80: 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e  n its own.  When
6f90: 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62  ever a new datab
6fa0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77  ase is opened, w
6fb0: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74  e have to find t
6fc0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69  he.** specific i
6fd0: 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  node of the data
6fe0: 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69  base file (the i
6ff0: 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e  node is determin
7000: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f  ed by the.** st_
7010: 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66  dev and st_ino f
7020: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61  ields of the sta
7030: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
7040: 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69   fstat() fills i
7050: 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20  n).** and check 
7060: 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64  for locks alread
7070: 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68  y existing on th
7080: 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20  at inode.  When 
7090: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65  locks are.** cre
70a0: 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c  ated or removed,
70b0: 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b   we have to look
70c0: 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65   at our own inte
70d0: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
70e0: 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73  he.** locks to s
70f0: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68  ee if another th
7100: 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75  read has previou
7110: 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f  sly set a lock o
7120: 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69  n that same.** i
7130: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69  node..**.** (Asi
7140: 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69  de: The use of i
7150: 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20  node numbers as 
7160: 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20  unique IDs does 
7170: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
7180: 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f  rks..** For VxWo
7190: 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  rks, we have to 
71a0: 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74  use the alternat
71b0: 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79  ive unique ID sy
71c0: 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  stem based on.**
71d0: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
71e0: 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e  ame and implemen
71f0: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69  ted in the previ
7200: 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a  ous division.).*
7210: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
7220: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  _file structure 
7230: 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20  for POSIX is no 
7240: 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69  longer just an i
7250: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
7260: 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69  escriptor.  It i
7270: 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72  s now a structur
7280: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  e that holds the
7290: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
72a0: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
72b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
72c0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
72d0: 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65  scribes the inte
72e0: 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e  rnal.** locks on
72f0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
7300: 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65  ng inode.  There
7310: 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20   is one locking 
7320: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
7330: 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68   inode, so if th
7340: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20  e same inode is 
7350: 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f  opened twice, bo
7360: 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  th unixFile stru
7370: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
7380: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
7390: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
73a0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
73b0: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
73c0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
73d0: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
73e0: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
73f0: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
7400: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
7410: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
7420: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
7430: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
7440: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
7450: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
7460: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
7470: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
7480: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
7490: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
74a0: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
74b0: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
74c0: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
74d0: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
74e0: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
74f0: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
7500: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
7510: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
7520: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
7530: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
7540: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
7550: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
7560: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
7570: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
7580: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
7590: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
75a0: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75   state..**.** Bu
75b0: 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61  t wait:  there a
75c0: 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62  re yet more prob
75d0: 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20  lems with POSIX 
75e0: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a  advisory locks..
75f0: 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f  **.** If you clo
7600: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
7610: 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ptor that points
7620: 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20   to a file that 
7630: 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c  has locks,.** al
7640: 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20  l locks on that 
7650: 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77  file that are ow
7660: 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
7670: 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a  nt process are.*
7680: 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20  * released.  To 
7690: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
76a0: 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75   problem, each u
76b0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
76c0: 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73  ect.** maintains
76d0: 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20   a count of the 
76e0: 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e  number of pendin
76f0: 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69  g locks on tha i
7700: 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e  node..** When an
7710: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
7720: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69   to close an uni
7730: 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20  xFile, if there 
7740: 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69  are.** other uni
7750: 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68  xFile open on th
7760: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61  e same inode tha
7770: 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f  t are holding lo
7780: 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a  cks, the call.**
7790: 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20   to close() the 
77a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
77b0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
77c0: 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  l all of the loc
77d0: 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65  ks clear..** The
77e0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
77f0: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61  tructure keeps a
7800: 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65   list of file de
7810: 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e  scriptors that n
7820: 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f  eed to.** be clo
7830: 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73  sed and that lis
7840: 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64  t is walked (and
7850: 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74   cleared) when t
7860: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20  he last lock.** 
7870: 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65  clears..**.** Ye
7880: 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65  t another proble
7890: 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73  m:  LinuxThreads
78a0: 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c   do not play wel
78b0: 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63  l with posix loc
78c0: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f  ks..**.** Many o
78d0: 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
78e0: 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c   linux use the L
78f0: 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72  inuxThreads libr
7900: 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ary which is.** 
7910: 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69  not posix compli
7920: 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75  ant.  Under Linu
7930: 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b  xThreads, a lock
7940: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
7950: 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62  ad.** A cannot b
7960: 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76  e modified or ov
7970: 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69  erridden by a di
7980: 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42  fferent thread B
7990: 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64  ..** Only thread
79a0: 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68   A can modify th
79b0: 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67  e lock.  Locking
79c0: 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72   behavior is cor
79d0: 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61  rect.** if the a
79e0: 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74  ppliation uses t
79f0: 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20  he newer Native 
7a00: 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62  Posix Thread Lib
7a10: 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f  rary (NPTL).** o
7a20: 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e  n linux - with N
7a30: 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  PTL a lock creat
7a40: 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63  ed by thread A c
7a50: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
7a60: 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42  s.** in thread B
7a70: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
7a80: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
7a90: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
7aa0: 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e  hich.** threadin
7ab0: 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69  g library is bei
7ac0: 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65  ng used.  So the
7ad0: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
7ae0: 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69  know at.** compi
7af0: 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20  le-time whether 
7b00: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20  or not thread A 
7b10: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
7b20: 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a  ks on thread B..
7b30: 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f  ** One has to do
7b40: 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63   a run-time chec
7b50: 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  k to discover th
7b60: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
7b70: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f  e.** current pro
7b80: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  cess..**.** SQLi
7b90: 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f  te used to suppo
7ba0: 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e  rt LinuxThreads.
7bb0: 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f    But support fo
7bc0: 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a  r LinuxThreads.*
7bd0: 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65  * was dropped be
7be0: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72  ginning with ver
7bf0: 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c  sion 3.7.0.  SQL
7c00: 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77  ite will still w
7c10: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75  ork with.** Linu
7c20: 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65  xThreads provide
7c30: 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65  d that (1) there
7c40: 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e   is no more than
7c50: 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   one connection 
7c60: 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65  .** per database
7c70: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d   file in the sam
7c80: 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32  e process and (2
7c90: 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  ) database conne
7ca0: 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74  ctions.** do not
7cb0: 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72   move across thr
7cc0: 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  eads..*/../*.** 
7cd0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
7ce0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
7cf0: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
7d00: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
7d10: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
7d20: 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64  ticular unixInod
7d30: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  eInfo object..*/
7d40: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
7d50: 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76  Id {.  dev_t dev
7d60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7d70: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
7d80: 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  ber */.#if OS_VX
7d90: 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76  WORKS.  struct v
7da0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
7db0: 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69  d;  /* Unique fi
7dc0: 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b  le ID for vxwork
7dd0: 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e  s. */.#else.  in
7de0: 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20  o_t ino;        
7df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f            /* Ino
7e00: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e  de number */.#en
7e10: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
7e20: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
7e30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
7e40: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
7e50: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
7e60: 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f  ** inode.  Or, o
7e70: 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  n LinuxThreads, 
7e80: 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20  there is one of 
7e90: 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73  these structures
7ea0: 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f   for.** each ino
7eb0: 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63  de opened by eac
7ec0: 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  h thread..**.** 
7ed0: 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63  A single inode c
7ee0: 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
7ef0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7f00: 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46  s, so each unixF
7f10: 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ile.** structure
7f20: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
7f30: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
7f40: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
7f50: 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62  t and this.** ob
7f60: 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75  ject keeps a cou
7f70: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
7f80: 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69   of unixFile poi
7f90: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a  nting to it..*/.
7fa0: 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65  struct unixInode
7fb0: 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20  Info {.  struct 
7fc0: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
7fd0: 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
7fe0: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
7ff0: 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20  int nShared;    
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8010: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41  /* Number of SHA
8020: 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  RED locks held *
8030: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8040: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
8050: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
8060: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
8070: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
8080: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8090: 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20   bProcessLock;  
80a0: 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69     /* An exclusi
80b0: 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20  ve process lock 
80c0: 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  is held */.  int
80d0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
80f0: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
8100: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
8110: 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ture */.  unixSh
8120: 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
8130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
8140: 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
8150: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
8160: 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  inode */.  int n
8170: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
8180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8190: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
81a0: 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a  ing file locks *
81b0: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
81c0: 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20   *pUnused;      
81d0: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69      /* Unused fi
81e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
81f0: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69  o close */.  uni
8200: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78  xInodeInfo *pNex
8210: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
8220: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78  List of all unix
8230: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
8240: 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  s */.  unixInode
8250: 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20  Info *pPrev;    
8260: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e         /*    ...
8270: 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20  . doubly linked 
8280: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
8290: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
82a0: 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  LE.  unsigned lo
82b0: 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79  ng long sharedBy
82c0: 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20  te;  /* for AFP 
82d0: 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64  simulated shared
82e0: 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a   lock */.#endif.
82f0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
8300: 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20   sem_t *pSem;   
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20   /* Named POSIX 
8330: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63  semaphore */.  c
8340: 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58  har aSemName[MAX
8350: 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f  _PATHNAME+2];  /
8360: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73  * Name of that s
8370: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64  emaphore */.#end
8380: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c  if.};../*.** A l
8390: 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78  ists of all unix
83a0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
83b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69  s..*/.static uni
83c0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64  xInodeInfo *inod
83d0: 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
83e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
83f0: 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  on - unixLogErro
8400: 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65  r_x(), is only e
8410: 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ver called via t
8420: 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78  he macro.** unix
8430: 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a  LogError()..**.*
8440: 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  * It is invoked 
8450: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f  after an error o
8460: 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66  ccurs in an OS f
8470: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e  unction and errn
8480: 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65  o has been.** se
8490: 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73  t. It logs a mes
84a0: 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74  sage using sqlit
84b0: 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e  e3_log() contain
84c0: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
84d0: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e  value of.** errn
84e0: 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62  o and, if possib
84f0: 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  le, the human-re
8500: 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e  adable equivalen
8510: 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28  t from strerror(
8520: 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72  ) or.** strerror
8530: 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  _r()..**.** The 
8540: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
8550: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
8560: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
8570: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
8580: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
8590: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
85a0: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
85b0: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
85c0: 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20  _CANTOPEN). .** 
85d0: 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65  The two subseque
85e0: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f  nt arguments sho
85f0: 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20  uld be the name 
8600: 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69  of the OS functi
8610: 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65  on that.** faile
8620: 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22  d (e.g. "unlink"
8630: 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68  , "open") and th
8640: 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  e the associated
8650: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
8660: 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f  h,.** if any..*/
8670: 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67  .#define unixLog
8680: 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20  Error(a,b,c)    
8690: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
86a0: 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45  ine(a,b,c,__LINE
86b0: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75  __).static int u
86c0: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
86d0: 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65  e(.  int errcode
86e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
86f0: 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65       /* SQLite e
8700: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63  rror code */.  c
8710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
8720: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8730: 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e  * Name of OS fun
8740: 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65  ction that faile
8750: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
8760: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
8770: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70         /* File p
8780: 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77  ath associated w
8790: 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69  ith error */.  i
87a0: 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20  nt iLine        
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
87c0: 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75  * Source line nu
87d0: 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72  mber where error
87e0: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a   occurred */.){.
87f0: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20    char *zErr;   
8800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8810: 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f    /* Message fro
8820: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20  m strerror() or 
8830: 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20  equivalent */.  
8840: 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72  int iErrno = err
8850: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
8860: 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c  /* Saved syscall
8870: 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f   error number */
8880: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
8890: 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61  s not a threadsa
88a0: 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45  fe build (SQLITE
88b0: 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c  _THREADSAFE==0),
88c0: 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74   then use.  ** t
88d0: 68 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75  he strerror() fu
88e0: 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  nction to obtain
88f0: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
8900: 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ble error messag
8910: 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e  e.  ** equivalen
8920: 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65  t to errno. Othe
8930: 72 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72  rwise, use strer
8940: 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23  ror_r()..  */ .#
8950: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
8960: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
8970: 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29  HAVE_STRERROR_R)
8980: 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d  .  char aErr[80]
8990: 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c  ;.  memset(aErr,
89a0: 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29   0, sizeof(aErr)
89b0: 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72  );.  zErr = aErr
89c0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52  ;..  /* If STRER
89d0: 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65  ROR_R_CHAR_P (se
89e0: 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63  t by autoconf sc
89f0: 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f  ripts) or __USE_
8a00: 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a  GNU is defined,.
8a10: 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
8a20: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
8a30: 69 64 65 73 20 74 68 65 20 74 68 65 20 47 4e 55  ides the the GNU
8a40: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65   version of stre
8a50: 72 72 6f 72 5f 72 28 29 20 74 68 61 74 20 0a 20  rror_r() that . 
8a60: 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f   ** returns a po
8a70: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
8a80: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
8a90: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
8aa0: 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20  That pointer .  
8ab0: 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ** may point to 
8ac0: 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61  aErr[], or it ma
8ad0: 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  y point to some 
8ae0: 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73  static storage s
8af0: 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20  omewhere. .  ** 
8b00: 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d  Otherwise, assum
8b10: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
8b20: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50  m provides the P
8b30: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20  OSIX version of 
8b40: 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  .  ** strerror_r
8b50: 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73  (), which always
8b60: 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72   writes an error
8b70: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45   message into aE
8b80: 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rr[]..  **.  ** 
8b90: 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f  If the code inco
8ba0: 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20  rrectly assumes 
8bb0: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50  that it is the P
8bc0: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61  OSIX version tha
8bd0: 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61  t is.  ** availa
8be0: 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d  ble, the error m
8bf0: 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65  essage will ofte
8c00: 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  n be an empty st
8c10: 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a  ring. Not a.  **
8c20: 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49   huge problem. I
8c30: 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c  ncorrectly concl
8c40: 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47  uding that the G
8c50: 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  NU version is av
8c60: 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  ailable .  ** co
8c70: 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65  uld lead to a se
8c80: 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20  gfault though.. 
8c90: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
8ca0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
8cb0: 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  P) || defined(__
8cc0: 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20  USE_GNU).  zErr 
8cd0: 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72  = .# endif.  str
8ce0: 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20  error_r(iErrno, 
8cf0: 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72  aErr, sizeof(aEr
8d00: 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51  r)-1);..#elif SQ
8d10: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
8d20: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74    /* This is a t
8d30: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
8d40: 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28   but strerror_r(
8d50: 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  ) is not availab
8d60: 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  le. */.  zErr = 
8d70: 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e  "";.#else.  /* N
8d80: 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75  on-threadsafe bu
8d90: 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ild, use strerro
8da0: 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  r(). */.  zErr =
8db0: 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f   strerror(iErrno
8dc0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
8dd0: 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51  ert( errcode!=SQ
8de0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
8df0: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
8e00: 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65  h = "";.  sqlite
8e10: 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20  3_log(errcode,. 
8e20: 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a       "os_unix.c:
8e30: 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20  %d: (%d) %s(%s) 
8e40: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69  - %s",.      iLi
8e50: 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e  ne, iErrno, zFun
8e60: 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20  c, zPath, zErr. 
8e70: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
8e80: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
8e90: 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  Close a file des
8ea0: 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  criptor..**.** W
8eb0: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c  e assume that cl
8ec0: 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77  ose() almost alw
8ed0: 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65  ays works, since
8ee0: 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61   it is only in a
8ef0: 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70  .** very sick ap
8f00: 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20  plication or on 
8f10: 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74  a very sick plat
8f20: 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67  form that it mig
8f30: 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69  ht fail..** If i
8f40: 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d  t does fail, sim
8f50: 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ply leak the fil
8f60: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75  e descriptor, bu
8f70: 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20  t do log the.** 
8f80: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  error..**.** Not
8f90: 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  e that it is not
8fa0: 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63   safe to retry c
8fb0: 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e  lose() after EIN
8fc0: 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  TR since the.** 
8fd0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
8fe0: 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61  might have alrea
8ff0: 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62  dy been reused b
9000: 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  y another thread
9010: 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74  ..** So we don't
9020: 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63   even try to rec
9030: 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e  over from an EIN
9040: 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68  TR.  Just log th
9050: 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d  e error.** and m
9060: 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ove on..*/.stati
9070: 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c  c void robust_cl
9080: 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ose(unixFile *pF
9090: 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20  ile, int h, int 
90a0: 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f  lineno){.  if( o
90b0: 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20  sClose(h) ){.   
90c0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
90d0: 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ine(SQLITE_IOERR
90e0: 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c  _CLOSE, "close",
90f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9100: 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20          pFile ? 
9110: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30  pFile->zPath : 0
9120: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d  , lineno);.  }.}
9130: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
9140: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
9150: 72 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e  rs accumuated in
9160: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
9170: 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74  fo->pUnused list
9180: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
9190: 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64  d closePendingFd
91a0: 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  s(unixFile *pFil
91b0: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
91c0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
91d0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
91e0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a  nixUnusedFd *p;.
91f0: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
9200: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70  pNext;.  for(p=p
9210: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
9220: 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
9230: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
9240: 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  t;.    robust_cl
9250: 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64  ose(pFile, p->fd
9260: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
9270: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
9280: 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e  ;.  }.  pInode->
9290: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
92a0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
92b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
92c0: 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73  ructure previous
92d0: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ly allocated by 
92e0: 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
92f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
9300: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
9310: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
9320: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
9330: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
9340: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
9350: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
9360: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
9370: 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46  eInodeInfo(unixF
9380: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
9390: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
93a0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
93b0: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
93c0: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
93d0: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
93e0: 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70  pInode) ){.    p
93f0: 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Inode->nRef--;. 
9400: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
9410: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
9420: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
9430: 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20  pShmNode==0 );. 
9440: 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
9450: 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
9460: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70     if( pInode->p
9470: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
9480: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
9490: 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49  pPrev->pNext==pI
94a0: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
94b0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
94c0: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
94d0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Next;.      }els
94e0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
94f0: 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49  t( inodeList==pI
9500: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
9510: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f  inodeList = pIno
9520: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  de->pNext;.     
9530: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e   }.      if( pIn
9540: 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ode->pNext ){.  
9550: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
9560: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
9570: 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  ev==pInode );.  
9580: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e        pInode->pN
9590: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ext->pPrev = pIn
95a0: 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ode->pPrev;.    
95b0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
95c0: 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a  3_free(pInode);.
95d0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
95e0: 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20  ** Given a file 
95f0: 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61  descriptor, loca
9600: 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  te the unixInode
9610: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
9620: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
9630: 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  at file descript
9640: 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  or.  Create a ne
9650: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
9660: 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75  ry.  The.** retu
9670: 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62  rn value might b
9680: 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
9690: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
96a0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  rs..**.** The mu
96b0: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
96c0: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
96d0: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
96e0: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
96f0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
9700: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
9710: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70  .** Return an ap
9720: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
9730: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
9740: 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  int findInodeInf
9750: 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  o(.  unixFile *p
9760: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
9770: 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65      /* Unix file
9780: 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20   with file desc 
9790: 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20  used in the key 
97a0: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
97b0: 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20  fo **ppInode    
97c0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
97d0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
97e0: 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29  object here */.)
97f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9810: 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c     /* System cal
9820: 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  l return code */
9830: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
9860: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69  scriptor for pFi
9870: 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  le */.  struct u
9880: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
9890: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70  ;      /* Lookup
98a0: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69   key for the uni
98b0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20  xInodeInfo */.  
98c0: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
98d0: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f  buf;           /
98e0: 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65  * Low-level file
98f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
9900: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9910: 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20  *pInode = 0;    
9920: 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e   /* Candidate un
9930: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
9940: 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ct */..  assert(
9950: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
9960: 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f   );..  /* Get lo
9970: 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74  w-level informat
9980: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69  ion about the fi
9990: 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75  le that we can u
99a0: 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61  sed to.  ** crea
99b0: 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65  te a unique name
99c0: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20   for the file.. 
99d0: 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65   */.  fd = pFile
99e0: 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73  ->h;.  rc = osFs
99f0: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
9a00: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
9a10: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
9a20: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
9a30: 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57  #ifdef EOVERFLOW
9a40: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
9a50: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52  lastErrno==EOVER
9a60: 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51  FLOW ) return SQ
9a70: 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64  LITE_NOLFS;.#end
9a80: 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
9a90: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
9aa0: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
9ab0: 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f  _.  /* On OS X o
9ac0: 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73  n an msdos files
9ad0: 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65  ystem, the inode
9ae0: 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72   number is repor
9af0: 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65  ted.  ** incorre
9b00: 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69  ctly for zero-si
9b10: 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74  ze files.  See t
9b20: 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f  icket #3260.  To
9b30: 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e   work.  ** aroun
9b40: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  d this problem (
9b50: 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61  we consider it a
9b60: 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f   bug in OS X, no
9b70: 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77  t SQLite).  ** w
9b80: 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73  e always increas
9b90: 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
9ba0: 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20  to 1 by writing 
9bb0: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
9bc0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65  ** prior to acce
9bd0: 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20  ssing the inode 
9be0: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65  number.  The one
9bf0: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73   byte written is
9c00: 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27  .  ** an ASCII '
9c10: 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69  S' character whi
9c20: 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20  ch also happens 
9c30: 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
9c40: 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  byte.  ** in the
9c50: 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79   header of every
9c60: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
9c70: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
9c80: 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  if there.  ** is
9c90: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
9ca0: 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74  n such that anot
9cb0: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61  her thread has a
9cc0: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
9cd0: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
9ce0: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
9cf0: 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20  base, no damage 
9d00: 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  is done..  */.  
9d10: 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73  if( statbuf.st_s
9d20: 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65  ize==0 && (pFile
9d30: 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  ->fsFlags & SQLI
9d40: 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
9d50: 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64  DOS)!=0 ){.    d
9d60: 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28  o{ rc = osWrite(
9d70: 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68  fd, "S", 1); }wh
9d80: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
9d90: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
9da0: 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20   if( rc!=1 ){.  
9db0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
9dc0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
9dd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9de0: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
9df0: 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28     rc = osFstat(
9e00: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
9e10: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
9e20: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
9e30: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
9e40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9e50: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
9e60: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d  .  }.#endif..  m
9e70: 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30  emset(&fileId, 0
9e80: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
9e90: 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20  );.  fileId.dev 
9ea0: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76  = statbuf.st_dev
9eb0: 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
9ec0: 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20  .  fileId.pId = 
9ed0: 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73  pFile->pId;.#els
9ee0: 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d  e.  fileId.ino =
9ef0: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
9f00: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65  .#endif.  pInode
9f10: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
9f20: 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
9f30: 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c   memcmp(&fileId,
9f40: 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   &pInode->fileId
9f50: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
9f60: 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  ) ){.    pInode 
9f70: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
9f80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64  .  }.  if( pInod
9f90: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f  e==0 ){.    pIno
9fa0: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
9fb0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e  loc( sizeof(*pIn
9fc0: 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ode) );.    if( 
9fd0: 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  pInode==0 ){.   
9fe0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9ff0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
a000: 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c    memset(pInode,
a010: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f   0, sizeof(*pIno
a020: 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  de));.    memcpy
a030: 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  (&pInode->fileId
a040: 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  , &fileId, sizeo
a050: 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20  f(fileId));.    
a060: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31  pInode->nRef = 1
a070: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e  ;.    pInode->pN
a080: 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ext = inodeList;
a090: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72  .    pInode->pPr
a0a0: 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ev = 0;.    if( 
a0b0: 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64  inodeList ) inod
a0c0: 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  eList->pPrev = p
a0d0: 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65  Inode;.    inode
a0e0: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  List = pInode;. 
a0f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f   }else{.    pIno
a100: 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  de->nRef++;.  }.
a110: 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e    *ppInode = pIn
a120: 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ode;.  return SQ
a130: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
a140: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a150: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
a160: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
a170: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
a180: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
a190: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
a1a0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
a1b0: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
a1c0: 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
a1d0: 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
a1e0: 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
a1f0: 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
a200: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
a210: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
a220: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
a230: 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
a240: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
a250: 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
a260: 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
a270: 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52  c int unixCheckR
a280: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
a290: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
a2a0: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
a2b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
a2c0: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
a2d0: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
a2e0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
a2f0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
a300: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
a310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
a320: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
a330: 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72  OCK; );..  asser
a340: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e  t( pFile );.  un
a350: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
a360: 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
a370: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
a380: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
a390: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s */..  /* Check
a3a0: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
a3b0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
a3c0: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
a3d0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
a3e0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
a3f0: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
a400: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
a410: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65  ;.  }..  /* Othe
a420: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
a430: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
a440: 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23  holds it..  */.#
a450: 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  ifndef __DJGPP__
a460: 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
a470: 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f   && !pFile->pIno
a480: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
a490: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66   ){.    struct f
a4a0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c  lock lock;.    l
a4b0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
a4c0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
a4d0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
a4e0: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c  RVED_BYTE;.    l
a4f0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
a500: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
a510: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66   F_WRLCK;.    if
a520: 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  ( osFcntl(pFile-
a530: 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
a540: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ck) ){.      rc 
a550: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
a560: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
a570: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
a580: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
a590: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
a5a0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f   lock.l_type!=F_
a5b0: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  UNLCK ){.      r
a5c0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
a5d0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
a5e0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
a5f0: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
a600: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
a610: 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22   %d %d (unix)\n"
a620: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
a630: 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
a640: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
a650: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
a660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
a670: 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65  t to set a syste
a680: 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  m-lock on the fi
a690: 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c  le pFile.  The l
a6a0: 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72  ock is .** descr
a6b0: 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a  ibed by pLock..*
a6c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c  *.** If the pFil
a6d0: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61  e was opened rea
a6e0: 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69  d/write from uni
a6f0: 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65  x-excl, then the
a700: 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76   only lock.** ev
a710: 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61  er obtained is a
a720: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
a730: 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61  , and it is obta
a740: 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  ined exactly onc
a750: 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  e.** the first t
a760: 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20  ime any lock is 
a770: 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20  attempted.  All 
a780: 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65  subsequent syste
a790: 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65  m locking.** ope
a7a0: 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e  rations become n
a7b0: 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20  o-ops.  Locking 
a7c0: 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c  operations still
a7d0: 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c   happen internal
a7e0: 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ly,.** in order 
a7f0: 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63  to coordinate ac
a800: 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70  cess between sep
a810: 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63  arate database c
a820: 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69  onnections.** wi
a830: 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  thin this proces
a840: 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68  s, but all of th
a850: 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  at is handled in
a860: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a   memory and the.
a870: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
a880: 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72  tem does not par
a890: 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ticipate..**.** 
a8a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
a8b0: 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20   a pass-through 
a8c0: 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b  to fcntl(F_SETLK
a8d0: 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73  ) if pFile is us
a8e0: 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f  ing.** any VFS o
a8f0: 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d  ther than "unix-
a900: 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c  excl" or if pFil
a910: 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22  e is opened on "
a920: 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e  unix-excl".** an
a930: 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  d is read-only..
a940: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
a950: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61  turned if the ca
a960: 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63  ll completes suc
a970: 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31  cessfully, or -1
a980: 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f   if a call.** to
a990: 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20   fcntl() fails. 
a9a0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72  In this case, er
a9b0: 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f  rno is set appro
a9c0: 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e  priately (by fcn
a9d0: 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tl())..*/.static
a9e0: 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63   int unixFileLoc
a9f0: 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
aa00: 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  e, struct flock 
aa10: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  *pLock){.  int r
aa20: 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  c;.  unixInodeIn
aa30: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
aa40: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
aa50: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
aa60: 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72  eld() );.  asser
aa70: 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a  t( pInode!=0 );.
aa80: 20 20 69 66 28 20 28 28 70 46 69 6c 65 2d 3e 63    if( ((pFile->c
aa90: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
aaa0: 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20  ILE_EXCL)!=0 || 
aab0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
aac0: 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28 28 70 46  Lock).   && ((pF
aad0: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
aae0: 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
aaf0: 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 69  )==0).  ){.    i
ab00: 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
ab10: 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
ab20: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
ab30: 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73   lock;.      ass
ab40: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
ab50: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c  ck==0 );.      l
ab60: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
ab70: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
ab80: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
ab90: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
aba0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
abb0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
abc0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
abd0: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72  F_WRLCK;.      r
abe0: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
abf0: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
ac00: 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  lock);.      if(
ac10: 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72   rc<0 ) return r
ac20: 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  c;.      pInode-
ac30: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20  >bProcessLock = 
ac40: 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  1;.      pInode-
ac50: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65  >nLock++;.    }e
ac60: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
ac70: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
ac80: 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  {.    rc = osFcn
ac90: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
aca0: 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20  ETLK, pLock);.  
acb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
acc0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
acd0: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
ace0: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
acf0: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
ad00: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
ad10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
ad20: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
ad30: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
ad40: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
ad50: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
ad60: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
ad70: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
ad80: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
ad90: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
ada0: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
adb0: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
adc0: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
add0: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
ade0: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
adf0: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
ae00: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
ae10: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
ae20: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
ae30: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
ae40: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
ae50: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
ae60: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
ae70: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
ae80: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
ae90: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
aea0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
aeb0: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
aec0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
aed0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
aee0: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
aef0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
af00: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
af10: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
af20: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
af30: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
af40: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
af50: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
af60: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
af70: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
af80: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
af90: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
afa0: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
afb0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
afc0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
afd0: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
afe0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
aff0: 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65   unixLock(sqlite
b000: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
b010: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a  eFileLock){.  /*
b020: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
b030: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
b040: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
b050: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
b060: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
b070: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
b080: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
b090: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
b0a0: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
b0b0: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
b0c0: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
b0d0: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
b0e0: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
b0f0: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
b100: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
b110: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
b120: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
b130: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
b140: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
b150: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
b160: 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f  tible with windo
b170: 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c  ws systems simul
b180: 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  taneously.  ** a
b190: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
b1a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
b1b0: 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73   in case that is
b1c0: 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a   ever required..
b1d0: 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c    **.  ** Symbol
b1e0: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e  s defined in os.
b1f0: 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20  h indentify the 
b200: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61  'pending byte' a
b210: 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64  nd the 'reserved
b220: 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63  .  ** byte', eac
b230: 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61  h single bytes a
b240: 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  t well known off
b250: 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73  sets, and the 's
b260: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
b270: 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20  range', a range 
b280: 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20  of 510 bytes at 
b290: 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  a well known off
b2a0: 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  set..  **.  ** T
b2b0: 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45  o obtain a SHARE
b2c0: 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c  D lock, a read-l
b2d0: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
b2e0: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a  on the 'pending.
b2f0: 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20    ** byte'.  If 
b300: 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66  this is successf
b310: 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ul, a random byt
b320: 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72  e from the 'shar
b330: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
b340: 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b  ge' is read-lock
b350: 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ed and the lock 
b360: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
b370: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a  byte' released..
b380: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
b390: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
b3a0: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
b3b0: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
b3c0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a   a SHARED lock..
b3d0: 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20    ** A RESERVED 
b3e0: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
b3f0: 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20  ted by grabbing 
b400: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
b410: 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76  the.  ** 'reserv
b420: 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a  ed byte'. .  **.
b430: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
b440: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
b450: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66   PENDING lock af
b460: 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69  ter it has obtai
b470: 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45  ned a.  ** SHARE
b480: 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e  D lock. A PENDIN
b490: 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  G lock is implem
b4a0: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
b4b0: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a  ng a write-lock.
b4c0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e    ** on the 'pen
b4d0: 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73  ding byte'. This
b4e0: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
b4f0: 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b   new SHARED lock
b500: 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62  s can be.  ** ob
b510: 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73  tained, but exis
b520: 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b  ting SHARED lock
b530: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
b540: 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63   persist. A proc
b550: 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  ess.  ** does no
b560: 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e  t have to obtain
b570: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
b580: 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61   on the way to a
b590: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20   PENDING lock.. 
b5a0: 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74   ** This propert
b5b0: 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  y is used by the
b5c0: 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72   algorithm for r
b5d0: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
b5e0: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
b5f0: 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20  after a crash.. 
b600: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c   **.  ** An EXCL
b610: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61  USIVE lock, obta
b620: 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e  ined after a PEN
b630: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c  DING lock is hel
b640: 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65  d, is.  ** imple
b650: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
b660: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
b670: 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27   on the entire '
b680: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
b690: 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61   range'. Since a
b6a0: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72  ll other locks r
b6b0: 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f  equire a read-lo
b6c0: 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ck on one of the
b6d0: 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68   bytes.  ** with
b6e0: 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74  in this range, t
b6f0: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
b700: 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20   no other locks 
b710: 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  are held on the.
b720: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a    ** database. .
b730: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65    **.  ** The re
b740: 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  ason a single by
b750: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  te cannot be use
b760: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
b770: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
b780: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61  ** range' is tha
b790: 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  t some versions 
b7a0: 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f  of windows do no
b7b0: 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c  t support read-l
b7c0: 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f  ocks. By.  ** lo
b7d0: 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62  cking a random b
b7e0: 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65  yte from a range
b7f0: 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41  , concurrent SHA
b800: 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78  RED locks may ex
b810: 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66  ist.  ** even if
b820: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69   the locking pri
b830: 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61  mitive used is a
b840: 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f  lways a write-lo
b850: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ck..  */.  int r
b860: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b870: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
b880: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
b890: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
b8a0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
b8b0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72  e->pInode;.  str
b8c0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
b8d0: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30    int tErrno = 0
b8e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
b8f0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
b900: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
b910: 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69  was %s(%s,%d) pi
b920: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
b930: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
b940: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
b950: 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
b960: 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
b970: 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ck),.      azFil
b980: 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
b990: 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
b9a0: 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70  ->nShared , getp
b9b0: 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  id()));..  /* If
b9c0: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
b9d0: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
b9e0: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
b9f0: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
ba00: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
ba10: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
ba20: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
ba30: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
ba40: 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
ba50: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
ba60: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
ba70: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
ba80: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
ba90: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
baa0: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
bab0: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
bac0: 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e  y held) (unix)\n
bad0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
bae0: 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
baf0: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
bb00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
bb10: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
bb20: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
bb30: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
bb40: 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
bb50: 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
bb60: 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
bb70: 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
bb80: 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
bb90: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
bba0: 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
bbb0: 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
bbc0: 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
bbd0: 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
bbe0: 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
bbf0: 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
bc00: 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
bc10: 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
bc20: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
bc30: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
bc40: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
bc50: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
bc60: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
bc70: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
bc80: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
bc90: 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
bca0: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
bcb0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
bcc0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
bcd0: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
bce0: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
bcf0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
bd00: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
bd10: 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
bd20: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
bd30: 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
bd40: 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
bd50: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
bd60: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
bd70: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
bd80: 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
bd90: 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
bda0: 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
bdb0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
bdc0: 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
bdd0: 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
bde0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
bdf0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
be00: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
be10: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
be20: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
be30: 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
be40: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
be50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
be60: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
be70: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
be80: 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
be90: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
bea0: 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
beb0: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
bec0: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
bed0: 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
bee0: 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
bef0: 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
bf00: 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
bf10: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
bf20: 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
bf30: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
bf40: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
bf50: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
bf60: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
bf70: 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
bf80: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
bf90: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
bfa0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
bfb0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
bfc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
bfd0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
bfe0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
bff0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
c000: 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
c010: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
c020: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
c030: 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
c040: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
c050: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
c060: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
c070: 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
c080: 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
c090: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
c0a0: 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
c0b0: 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
c0c0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
c0d0: 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
c0e0: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
c0f0: 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
c100: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
c110: 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
c120: 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
c130: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
c140: 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  ET;.  if( eFileL
c150: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
c160: 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
c170: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
c180: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
c190: 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
c1a0: 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
c1b0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
c1c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c1d0: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
c1e0: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
c1f0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
c200: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66  ING_BYTE;.    if
c210: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
c220: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
c230: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
c240: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
c250: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
c260: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
c270: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
c280: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
c290: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
c2a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
c2b0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
c2c0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
c2d0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
c2e0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  ck;.    }.  }...
c2f0: 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
c300: 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
c310: 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
c320: 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
c330: 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
c340: 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
c350: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
c360: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
c370: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
c380: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
c390: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
c3a0: 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
c3b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
c3c0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
c3d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
c3e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
c3f0: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
c400: 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
c410: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
c420: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
c430: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
c440: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c450: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
c460: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
c470: 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  k) ){.      tErr
c480: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
c4a0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
c4b0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
c4c0: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
c4d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   }..    /* Drop 
c4e0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
c4f0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
c500: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c510: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
c520: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c530: 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  1L;.    lock.l_t
c540: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
c550: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
c560: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
c570: 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
c580: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
c590: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
c5a0: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
c5b0: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74  mount */.      t
c5c0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
c5d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c5e0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a  _IOERR_UNLOCK; .
c5f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
c600: 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  c ){.      if( r
c610: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
c620: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
c630: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
c640: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
c650: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c660: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c670: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
c680: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
c690: 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
c6a0: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
c6b0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
c6c0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
c6d0: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
c6e0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
c6f0: 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
c700: 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
c710: 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
c720: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
c730: 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
c740: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
c750: 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
c760: 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
c770: 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
c780: 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
c790: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
c7a0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
c7b0: 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
c7c0: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
c7d0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
c7e0: 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
c7f0: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
c800: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
c810: 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
c820: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
c830: 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
c840: 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
c850: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
c860: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
c870: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20   = F_WRLCK;..   
c880: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
c890: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
c8a0: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
c8b0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
c8c0: 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  ;.    if( eFileL
c8d0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
c8e0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  CK ){.      lock
c8f0: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
c900: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
c910: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
c920: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c930: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c940: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
c950: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
c960: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
c970: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e     }..    if( un
c980: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
c990: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
c9a0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
c9b0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
c9c0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
c9d0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
c9e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
c9f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
ca00: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
ca10: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
ca20: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
ca30: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
ca40: 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66  .  }.  ..#ifndef
ca50: 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74   NDEBUG.  /* Set
ca60: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
ca70: 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
ca80: 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
ca90: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
caa0: 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
cab0: 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
cac0: 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
cad0: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
cae0: 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
caf0: 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
cb00: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
cb10: 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
cb20: 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
cb30: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
cb40: 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
cb50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
cb60: 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  .   && pFile->eF
cb70: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
cb80: 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65  LOCK.   && eFile
cb90: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
cba0: 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69  OCK.  ){.    pFi
cbb0: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
cbc0: 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  g = 0;.    pFile
cbd0: 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
cbe0: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
cbf0: 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20  malWrite = 1;.  
cc00: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28  }.#endif...  if(
cc10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cc20: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
cc30: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
cc40: 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
cc50: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
cc60: 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
cc70: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
cc80: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
cc90: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
cca0: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
ccb0: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
ccc0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
ccd0: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
cce0: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
ccf0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
cd00: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
cd10: 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78    %d %s %s (unix
cd20: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
cd30: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
cd40: 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63  Lock), .      rc
cd50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
cd60: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
cd70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
cd80: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66  ./*.** Add the f
cd90: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
cda0: 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64  sed by file hand
cdb0: 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20  le pFile to the 
cdc0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
cdd0: 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a   pUnused list..*
cde0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
cdf0: 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46  tPendingFd(unixF
ce00: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
ce10: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
ce20: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
ce30: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
ce40: 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d  edFd *p = pFile-
ce50: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70  >pUnused;.  p->p
ce60: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
ce70: 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65  Unused;.  pInode
ce80: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
ce90: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
cea0: 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64    pFile->pUnused
ceb0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
cec0: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
ced0: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
cee0: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
cef0: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
cf00: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
cf10: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
cf20: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
cf30: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
cf40: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
cf50: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
cf60: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
cf70: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
cf80: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
cf90: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
cfa0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
cfb0: 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68  -op..** .** If h
cfc0: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69  andleNFSUnlock i
cfd0: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20  s true, then on 
cfe0: 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45  downgrading an E
cff0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f  XCLUSIVE_LOCK to
d000: 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62   SHARED.** the b
d010: 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76  yte range is div
d020: 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74  ided into 2 part
d030: 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  s and the first 
d040: 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64  part is unlocked
d050: 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20   then.** set to 
d060: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65  a read lock, the
d070: 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74  n the other part
d080: 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63   is simply unloc
d090: 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ked.  This works
d0a0: 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75   .** around a bu
d0b0: 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63  g in BSD NFS loc
d0c0: 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e  kd (also seen on
d0d0: 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74   MacOSX 10.3+) t
d0e0: 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a  hat fails to .**
d0f0: 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74   remove the writ
d100: 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69  e lock on a regi
d110: 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  on when a read l
d120: 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73  ock is set..*/.s
d130: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55  tatic int posixU
d140: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
d150: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
d160: 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c  eLock, int handl
d170: 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75  eNFSUnlock){.  u
d180: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
d190: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
d1a0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
d1b0: 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  *pInode;.  struc
d1c0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
d1d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d1e0: 4f 4b 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20  OK;.  int h;..  
d1f0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
d200: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
d210: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
d220: 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
d230: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
d240: 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
d250: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
d260: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
d270: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
d280: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
d290: 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
d2a0: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
d2b0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
d2c0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
d2d0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
d2e0: 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
d2f0: 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
d300: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d310: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
d320: 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d  ();.  h = pFile-
d330: 3e 68 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  >h;.  pInode = p
d340: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
d350: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
d360: 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
d370: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
d380: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
d390: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d3a0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d3b0: 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
d3c0: 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
d3d0: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
d3e0: 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
d3f0: 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
d400: 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
d410: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
d420: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
d430: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
d440: 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
d450: 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
d460: 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
d470: 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
d480: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d490: 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
d4a0: 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
d4b0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
d4c0: 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
d4d0: 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
d4e0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
d4f0: 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
d500: 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
d510: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
d520: 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
d530: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
d540: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
d550: 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
d560: 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
d570: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
d580: 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
d590: 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
d5a0: 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
d5b0: 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
d5c0: 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
d5d0: 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
d5e0: 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
d5f0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
d600: 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20 61    */.#if 0.    a
d610: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e  ssert( pFile->in
d620: 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20  NormalWrite==0. 
d630: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
d640: 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
d650: 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
d660: 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
d670: 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1 );.#endif.    
d680: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
d690: 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
d6a0: 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61  ..    /* downgra
d6b0: 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64  ding to a shared
d6c0: 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76   lock on NFS inv
d6d0: 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74  olves clearing t
d6e0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20  he write lock.  
d6f0: 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61    ** before esta
d700: 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61  blishing the rea
d710: 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64  dlock - to avoid
d720: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
d730: 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20  n we downgrade. 
d740: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69     ** the lock i
d750: 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74  n 2 blocks, so t
d760: 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  hat part of the 
d770: 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f  range will be co
d780: 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20  vered by a .    
d790: 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e  ** write lock un
d7a0: 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20  til the rest is 
d7b0: 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61  covered by a rea
d7c0: 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20  d lock:.    **  
d7d0: 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20  1:   [WWWWW].   
d7e0: 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57   **  2:   [....W
d7f0: 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b  ].    **  3:   [
d800: 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34  RRRRW].    **  4
d810: 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20  :   [RRRR.].    
d820: 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  */.    if( eFile
d830: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
d840: 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65 66 69 6e  K ){..#if !defin
d850: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
d860: 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   !SQLITE_ENABLE_
d870: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
d880: 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65      (void)handle
d890: 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  NFSUnlock;.     
d8a0: 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e   assert( handleN
d8b0: 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23  FSUnlock==0 );.#
d8c0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
d8d0: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
d8e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
d8f0: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
d900: 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55    if( handleNFSU
d910: 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  nlock ){.       
d920: 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20   int tErrno;    
d930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
d940: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79  ror code from sy
d950: 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73  stem call errors
d960: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   */.        off_
d970: 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52  t divSize = SHAR
d980: 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20  ED_SIZE - 1;.   
d990: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f       .        lo
d9a0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
d9b0: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
d9c0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d9d0: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
d9e0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
d9f0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
da00: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
da10: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
da20: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
da30: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
da40: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
da50: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
da60: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
da70: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
da80: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
da90: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
daa0: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
dab0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
dac0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
dad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
dae0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
daf0: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
db00: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
db10: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
db20: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
db30: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
db40: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
db50: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
db60: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
db70: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
db80: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
db90: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
dba0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
dbb0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
dbc0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
dbd0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
dbe0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
dbf0: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
dc00: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  , SQLITE_IOERR_R
dc10: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
dc20: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
dc30: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
dc40: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
dc50: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
dc60: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
dc70: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
dc80: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
dc90: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
dca0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
dcb0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
dcc0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
dcd0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
dce0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
dcf0: 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b  D_FIRST+divSize;
dd00: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
dd10: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
dd20: 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  E-divSize;.     
dd30: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
dd40: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
dd50: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
dd60: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
dd70: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
dd80: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
dd90: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
dda0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
ddb0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
ddc0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
ddd0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
dde0: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
ddf0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
de00: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
de10: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a    }.      }else.
de20: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
de30: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
de40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
de50: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20  CKING_STYLE */. 
de60: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c       {.        l
de70: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
de80: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
de90: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
dea0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
deb0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
dec0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ded0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
dee0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
def0: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
df00: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
df10: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 20  lock) ){.       
df20: 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
df30: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69   the call to uni
df40: 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e  xFileLock() cann
df50: 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65 20  ot fail because 
df60: 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  another.        
df70: 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20    ** process is 
df80: 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d  holding an incom
df90: 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66  patible lock. If
dfa0: 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a   it does, this .
dfb0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
dfc0: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
dfd0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
dfe0: 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   not following t
dff0: 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20  he locking.     
e000: 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c       ** protocol
e010: 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
e020: 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
e030: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52  _IOERR_RDLOCK. R
e040: 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
e050: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
e060: 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20  Y would confuse 
e070: 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
e080: 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74 20  (in practice it 
e090: 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20 20  causes .        
e0a0: 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74    ** an assert t
e0b0: 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20  o fail). */ .   
e0c0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
e0d0: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b  TE_IOERR_RDLOCK;
e0e0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
e0f0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
e100: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 67  rno;.          g
e110: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
e120: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e130: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b  }.    }.    lock
e140: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
e150: 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  K;.    lock.l_wh
e160: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
e170: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
e180: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
e190: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
e1a0: 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20   = 2L;  assert( 
e1b0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d  PENDING_BYTE+1==
e1c0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b  RESERVED_BYTE );
e1d0: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
e1e0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
e1f0: 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)==0 ){.      
e200: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e210: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
e220: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e230: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e240: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
e250: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
e260: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
e270: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
e280: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
e290: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  f( eFileLock==NO
e2a0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
e2b0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
e2c0: 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
e2d0: 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
e2e0: 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
e2f0: 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
e300: 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
e310: 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
e320: 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
e330: 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
e340: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
e350: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
e360: 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
e370: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
e380: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
e390: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
e3a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
e3b0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
e3c0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
e3d0: 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
e3e0: 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75  = 0L;.      Simu
e3f0: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
e400: 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  n(1);.      Simu
e410: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
e420: 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75  -1) ).      Simu
e430: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
e440: 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
e450: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
e460: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
e470: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
e480: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
e490: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
e4a0: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
e4b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
e4c0: 4f 43 4b 3b 0a 09 70 46 69 6c 65 2d 3e 6c 61 73  OCK;..pFile->las
e4d0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e4e0: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
e4f0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
e500: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
e510: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
e520: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
e530: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
e540: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
e550: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
e560: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
e570: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
e580: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
e590: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
e5a0: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
e5b0: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
e5c0: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
e5d0: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
e5e0: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
e5f0: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
e600: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
e610: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
e620: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
e630: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
e640: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
e650: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
e660: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
e670: 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e    }.  }...end_un
e680: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
e690: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
e6a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
e6b0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e6c0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
e6d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e6e0: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
e6f0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
e700: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
e710: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
e720: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
e730: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
e740: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
e750: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
e760: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
e770: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
e780: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
e790: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
e7a0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
e7b0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
e7c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e7d0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
e7e0: 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
e7f0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
e800: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
e810: 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f  ck){.  return po
e820: 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
e830: 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a  ileLock, 0);.}..
e840: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e850: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
e860: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
e870: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
e880: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
e890: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
e8a0: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
e8b0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
e8c0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
e8d0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
e8e0: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
e8f0: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
e900: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
e910: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
e920: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
e930: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
e940: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
e950: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
e960: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
e970: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
e980: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
e990: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
e9a0: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
e9b0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
e9c0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
e9d0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
e9e0: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
e9f0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
ea00: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
ea10: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
ea20: 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66   if( pFile->dirf
ea30: 64 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75  d>=0 ){.    robu
ea40: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
ea50: 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 20 5f 5f  pFile->dirfd, __
ea60: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69  LINE__);.    pFi
ea70: 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20  le->dirfd=-1;.  
ea80: 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  }.  if( pFile->h
ea90: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73  >=0 ){.    robus
eaa0: 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
eab0: 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
eac0: 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  _);.    pFile->h
ead0: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f   = -1;.  }.#if O
eae0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
eaf0: 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20  pFile->pId ){.  
eb00: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73 44    if( pFile->isD
eb10: 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 75  elete ){.      u
eb20: 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
eb30: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
eb40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
eb50: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
eb60: 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
eb70: 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
eb80: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
eb90: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
eba0: 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
ebb0: 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
ebc0: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
ebd0: 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
ebe0: 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  pUnused);.  mems
ebf0: 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
ec00: 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
ec10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ec20: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
ec30: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
ec40: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
ec50: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
ec60: 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
ec70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
ec80: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
ec90: 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
eca0: 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c    unixUnlock(id,
ecb0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69   NO_LOCK);.  uni
ecc0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
ecd0: 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49    /* unixFile.pI
ece0: 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76  node is always v
ecf0: 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72  alid here. Other
ed00: 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e  wise, a differen
ed10: 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75  t close.  ** rou
ed20: 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63  tine (e.g. noloc
ed30: 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20  kClose()) would 
ed40: 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
ed50: 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
ed60: 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
ed70: 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c  >nLock>0 || pFil
ed80: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
ed90: 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  essLock==0 );.  
eda0: 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65  if( ALWAYS(pFile
edb0: 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69  ->pInode) && pFi
edc0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
edd0: 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
ede0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
edf0: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
ee00: 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
ee10: 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
ee20: 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
ee30: 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
ee40: 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
ee50: 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
ee60: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
ee70: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
ee80: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  ode->pUnused lis
ee90: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  t.  It will be a
eea0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
eeb0: 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sed .    ** when
eec0: 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
eed0: 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  s cleared..    *
eee0: 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67  /.    setPending
eef0: 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  Fd(pFile);.  }. 
ef00: 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
ef10: 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d  o(pFile);.  rc =
ef20: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
ef30: 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  d);.  unixLeaveM
ef40: 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
ef50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
ef60: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
ef70: 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
ef80: 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
ef90: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
efa0: 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eff0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
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 2a 2a 2a 2a 2a 2a 2a  ****************
f020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f040: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
f050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f060: 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f  ******* No-op Lo
f070: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
f080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f090: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
f0a0: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
f0b0: 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
f0c0: 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c  tions available,
f0d0: 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20   this is by far 
f0e0: 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a  the.** simplest:
f0f0: 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e    locking is ign
f100: 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70  ored.  No attemp
f110: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63  t is made to loc
f120: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  k the database.*
f130: 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  * file for readi
f140: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  ng or writing..*
f150: 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e  *.** This lockin
f160: 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70  g mode is approp
f170: 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e  riate for use on
f180: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
f190: 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74  ases.** (ex: dat
f1a0: 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20  abases that are 
f1b0: 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52  burned into CD-R
f1c0: 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  OM, for example.
f1d0: 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73  )  It can.** als
f1e0: 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  o be used if the
f1f0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70   application emp
f200: 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e  loys some extern
f210: 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a  al mechanism to.
f220: 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c  ** prevent simul
f230: 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f  taneous access o
f240: 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
f250: 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f  ase by two or mo
f260: 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  re.** database c
f270: 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74  onnections.  But
f280: 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69   there is a seri
f290: 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61  ous risk of data
f2a0: 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
f2b0: 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69  on if this locki
f2c0: 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
f2d0: 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68  in situations wh
f2e0: 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ere multiple.** 
f2f0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f300: 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69  ions are accessi
f310: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
f320: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
f330: 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e   same.** time an
f340: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
f350: 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
f360: 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a  ns are writing..
f370: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  */..static int n
f380: 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
f390: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(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 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
f3c0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
f3d0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
f3e0: 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
f3f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f400: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f410: 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
f420: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
f430: 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
f440: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
f450: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
f460: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
f470: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
f480: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
f490: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f4a0: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
f4b0: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
f4c0: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
f4d0: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
f4e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f4f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
f500: 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  se the file..*/.
f510: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f520: 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
f530: 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74  ile *id) {.  ret
f540: 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
f550: 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  e(id);.}../*****
f560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
f570: 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20  nd of the no-op 
f580: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
f590: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
f5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
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 2a 2a 2a 2a 2a  ****************
f620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
f650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f660: 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66  **** Begin dot-f
f670: 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ile Locking ****
f680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
f6a0: 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63   The dotfile loc
f6b0: 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
f6c0: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69  ion uses the exi
f6d0: 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61  stance of separa
f6e0: 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73  te lock.** files
f6f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
f700: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
f710: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
f720: 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74  is works on just
f730: 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20  .** about every 
f740: 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
f750: 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
f760: 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
f770: 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
f780: 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
f790: 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
f7a0: 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
f7b0: 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
f7c0: 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
f7d0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
f7e0: 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
f7f0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
f800: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
f810: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
f820: 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
f830: 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
f840: 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
f850: 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
f860: 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
f870: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
f880: 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
f890: 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
f8a0: 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
f8b0: 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
f8c0: 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
f8d0: 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
f8e0: 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
f8f0: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
f900: 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
f910: 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
f920: 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68  ing a file in th
f930: 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
f940: 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   as the.** datab
f950: 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
f960: 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
f970: 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
f980: 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
f990: 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20  * The existance 
f9a0: 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69  of a lock file i
f9b0: 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
f9c0: 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
f9d0: 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70  ther lock.** typ
f9e0: 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
f9f0: 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
fa00: 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
fa10: 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
fa20: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
fa30: 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
fa40: 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
fa50: 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
fa60: 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
fa70: 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66  ck file..*/.#def
fa80: 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  ine DOTLOCK_SUFF
fa90: 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a  IX ".lock"../*.*
faa0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
fab0: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
fac0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
fad0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
fae0: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
faf0: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
fb00: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
fb10: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
fb20: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
fb30: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
fb40: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
fb50: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
fb60: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
fb70: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
fb80: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
fb90: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
fba0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
fbb0: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
fbc0: 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  cking..**.** In 
fbd0: 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
fbe0: 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65   either a lock e
fbf0: 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73  xists or it does
fc00: 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69   not.  So in thi
fc10: 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f  s.** variation o
fc20: 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  f CheckReservedL
fc30: 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20  ock(), *pResOut 
fc40: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
fc50: 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f any lock.** is
fc60: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
fc70: 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  e and false if t
fc80: 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
fc90: 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
fca0: 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  nt dotlockCheckR
fcb0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
fcc0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
fcd0: 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
fce0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
fcf0: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
fd00: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
fd10: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
fd20: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
fd30: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
fd40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
fd50: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
fd60: 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
fd70: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
fd80: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
fd90: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
fda0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
fdb0: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
fdc0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
fdd0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
fde0: 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
fdf0: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
fe00: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  or some other co
fe10: 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nnection in the 
fe20: 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20  same process.   
fe30: 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b   ** holds a lock
fe40: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e   on the file.  N
fe50: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
fe60: 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  further. */.    
fe70: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
fe80: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
fe90: 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69  e lock is held i
fea0: 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68  f and only if th
feb0: 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74  e lockfile exist
fec0: 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  s */.    const c
fed0: 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
fee0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46   (const char*)pF
fef0: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
ff00: 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65  ext;.    reserve
ff10: 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f  d = osAccess(zLo
ff20: 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20  ckFile, 0)==0;. 
ff30: 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
ff40: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
ff50: 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d %d (dotlock)\n
ff60: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
ff70: 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a   reserved));.  *
ff80: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
ff90: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
ffa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
ffb0: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
ffc0: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
ffd0: 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
ffe0: 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
fff0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
10000 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
10010 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
10020 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
10030 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
10040 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
10050 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
10060 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
10070 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
10080 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
10090 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
100a0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
100b0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
100c0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
100d0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
100e0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
100f0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
10100 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
10110 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
10120 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
10130 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
10140 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
10150 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
10160 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
10170 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
10180 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
10190 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
101a0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
101b0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
101c0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
101d0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
101e0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
101f0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
10200 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
10210 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
10220 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
10230 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
10240 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
10250 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
10260 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
10270 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
10280 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
10290 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
102a0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
102b0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
102c0 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
102d0 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
102e0 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
102f0 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
10300 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
10310 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
10320 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
10330 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
10340 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
10350 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
10360 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
10370 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
10380 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
10390 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
103a0 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  d;.  int fd;.  c
103b0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
103c0 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
103d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
103e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
103f0 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
10400 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
10410 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
10420 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
10430 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
10440 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
10450 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
10460 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
10470 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
10480 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
10490 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
104a0 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
104b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
104c0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20  ileLock;.    /* 
104d0 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
104e0 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
104f0 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23  he old file */.#
10500 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
10510 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b  .    utime(zLock
10520 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  File, NULL);.#el
10530 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c  se.    utimes(zL
10540 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  ockFile, NULL);.
10550 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
10560 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10570 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
10580 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
10590 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74  */.  fd = robust
105a0 5f 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c  _open(zLockFile,
105b0 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54  O_RDONLY|O_CREAT
105c0 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20  |O_EXCL,0600);. 
105d0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
105e0 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70   /* failed to op
105f0 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
10600 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  le, someone else
10610 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e   may have stolen
10620 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
10630 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
10640 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
10650 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
10660 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
10670 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
10680 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
10690 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
106a0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
106b0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
106c0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
106d0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
106e0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
106f0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10700 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
10710 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
10720 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 72 6f 62  n rc;.  } .  rob
10730 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
10740 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
10750 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20    .  /* got it, 
10760 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
10770 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
10780 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10790 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
107a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
107b0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
107c0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
107d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
107e0 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
107f0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
10800 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
10810 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
10820 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
10830 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
10840 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
10850 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
10860 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
10870 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
10880 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
10890 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
108a0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
108b0 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  When the locking
108c0 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e   level reaches N
108d0 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74  O_LOCK, delete t
108e0 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f  he lock file..*/
108f0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
10900 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
10910 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
10920 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
10930 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
10940 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
10950 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
10960 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c  e = (char *)pFil
10970 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
10980 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  t;..  assert( pF
10990 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
109a0 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
109b0 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
109c0 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69  dotlock)\n", pFi
109d0 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
109e0 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ,..   pFile->eFi
109f0 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29  leLock, getpid()
10a00 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
10a10 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
10a20 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
10a30 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
10a40 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
10a50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
10a60 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
10a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10a80 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77    }..  /* To dow
10a90 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65 64  ngrade to shared
10aa0 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20  , simply update 
10ab0 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74  our internal not
10ac0 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
10ad0 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20  lock state.  No 
10ae0 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74  need to mess wit
10af0 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  h the file on di
10b00 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  sk..  */.  if( e
10b10 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
10b20 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
10b30 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
10b40 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
10b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10b60 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  K;.  }.  .  /* T
10b70 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74  o fully unlock t
10b80 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c  he database, del
10b90 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  ete the lock fil
10ba0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  e */.  assert( e
10bb0 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
10bc0 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e  K );.  if( unlin
10bd0 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a  k(zLockFile) ){.
10be0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a      int rc = 0;.
10bf0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
10c00 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
10c10 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f  ENOENT != tErrno
10c20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
10c30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
10c40 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  CK;.    }.    if
10c50 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
10c60 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
10c70 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
10c80 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
10c90 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
10ca0 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
10cb0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
10cc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10cd0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
10ce0 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65  se a file.  Make
10cf0 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68   sure the lock h
10d00 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  as been released
10d10 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e   before closing.
10d20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
10d30 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  otlockClose(sqli
10d40 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
10d50 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
10d60 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
10d70 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10d80 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64  xFile*)id;.    d
10d90 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c  otlockUnlock(id,
10da0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73   NO_LOCK);.    s
10db0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
10dc0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
10dd0 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63  t);.  }.  rc = c
10de0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
10df0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10e00 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
10e10 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
10e20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d  dot-file lock im
10e30 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
10e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e50 0a 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 2a 2a 2a 2a 2a 2a 2a  ****************
10e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2f  ***************/
10ea0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
10eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ef0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
10f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
10f10 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67  in flock Locking
10f20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
10f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f40 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  *.**.** Use the 
10f50 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63  flock() system c
10f60 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c  all to do file l
10f70 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c  ocking..**.** fl
10f80 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73  ock() locking is
10f90 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c   like dot-file l
10fa0 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74  ocking in that t
10fb0 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69  he various.** fi
10fc0 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67  ne-grain locking
10fd0 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65   levels supporte
10fe0 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20  d by SQLite are 
10ff0 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a  collapsed into.*
11000 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75  * a single exclu
11010 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f  sive lock.  In o
11020 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52  ther words, SHAR
11030 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e  ED, RESERVED, an
11040 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63  d.** PENDING loc
11050 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ks are the same 
11060 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c  thing as an EXCL
11070 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c  USIVE lock.  SQL
11080 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72  ite.** still wor
11090 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74  ks when you do t
110a0 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72  his, but concurr
110b0 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20  ency is reduced 
110c0 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20  since.** only a 
110d0 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
110e0 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  an be reading th
110f0 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20  e database at a 
11100 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74  time..**.** Omit
11110 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66   this section if
11120 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
11130 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20  OCKING_STYLE is 
11140 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66  turned off or if
11150 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f  .** compiling fo
11160 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69  r VXWORKS..*/.#i
11170 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11180 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
11190 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a   !OS_VXWORKS../*
111a0 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28  .** Retry flock(
111b0 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69  ) calls that fai
111c0 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a  l with EINTR.*/.
111d0 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61  #ifdef EINTR.sta
111e0 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66  tic int robust_f
111f0 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74  lock(int fd, int
11200 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   op){.  int rc;.
11210 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b    do{ rc = flock
11220 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28  (fd,op); }while(
11230 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
11240 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
11250 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  n rc;.}.#else.# 
11260 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c  define robust_fl
11270 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61  ock(a,b) flock(a
11280 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ,b).#endif.     
11290 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
112a0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
112b0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
112c0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
112d0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
112e0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
112f0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
11300 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
11310 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
11320 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
11330 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
11340 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
11350 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
11360 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
11370 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
11380 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
11390 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
113a0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
113b0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
113c0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
113d0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
113e0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
113f0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
11400 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11410 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
11420 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
11430 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11440 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11450 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
11460 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
11470 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
11480 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
11490 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
114a0 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68  le );.  .  /* Ch
114b0 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
114c0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
114d0 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
114e0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
114f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
11500 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
11510 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
11520 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
11530 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
11540 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
11550 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
11560 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
11570 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67   /* attempt to g
11580 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  et the lock */. 
11590 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62     int lrc = rob
115a0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
115b0 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
115c0 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20  CK_NB);.    if( 
115d0 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  !lrc ){.      /*
115e0 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75   got the lock, u
115f0 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20  nlock it */.    
11600 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66    lrc = robust_f
11610 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
11620 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69  OCK_UN);.      i
11630 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20  f ( lrc ) {.    
11640 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
11650 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
11660 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64  /* unlock failed
11670 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a   with an error *
11680 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20  /.        lrc = 
11690 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
116a0 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20 20 69 66  OCK; .        if
116b0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
116c0 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
116d0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
116e0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
116f0 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
11700 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11710 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
11720 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
11730 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
11740 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
11750 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
11760 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69  lse might have i
11770 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20  t reserved */.  
11780 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65      lrc = sqlite
11790 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
117a0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
117b0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20  TE_IOERR_LOCK); 
117c0 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
117d0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
117e0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
117f0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
11800 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  no;.        rc =
11810 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
11820 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
11830 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
11840 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b   %d %d %d (flock
11850 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
11860 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
11870 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
11880 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
11890 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
118a0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
118b0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
118c0 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
118d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73  LITE_OK;.    res
118e0 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e  erved=1;.  }.#en
118f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
11900 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
11910 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65  ERRORS */.  *pRe
11920 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
11930 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11940 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
11950 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
11960 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
11970 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
11980 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
11990 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
119a0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
119b0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
119c0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
119d0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
119e0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
119f0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
11a00 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
11a10 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
11a20 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
11a30 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
11a40 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
11a50 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
11a60 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
11a70 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
11a80 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
11a90 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
11aa0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
11ab0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
11ac0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
11ad0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
11ae0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
11af0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
11b00 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
11b10 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
11b20 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
11b30 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
11b40 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
11b50 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
11b60 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
11b70 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
11b80 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
11b90 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
11ba0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
11bb0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
11bc0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
11bd0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
11be0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
11bf0 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  IVE.**.** flock(
11c00 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  ) only really su
11c10 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
11c20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
11c30 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
11c40 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
11c50 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
11c60 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
11c70 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
11c80 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
11c90 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
11ca0 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
11cb0 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
11cc0 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
11cd0 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
11ce0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11cf0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
11d00 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
11d10 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
11d20 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
11d30 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
11d40 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
11d50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
11d60 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
11d70 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
11d80 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
11d90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11da0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11db0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11dc0 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
11dd0 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
11de0 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
11df0 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
11e00 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
11e10 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
11e20 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
11e30 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
11e40 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
11e50 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
11e60 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
11e70 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
11e80 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
11e90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
11ea0 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
11eb0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
11ec0 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66   .  if (robust_f
11ed0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
11ee0 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
11ef0 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  )) {.    int tEr
11f00 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
11f10 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
11f20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
11f30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
11f40 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
11f50 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
11f60 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
11f70 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11f80 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
11f90 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11fa0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
11fb0 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
11fc0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
11fd0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
11fe0 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70  turn ok */.    p
11ff0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12000 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
12010 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
12020 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66  K    %d %s %s (f
12030 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
12040 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
12050 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
12060 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
12070 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
12080 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66  ailed"));.#ifdef
12090 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
120a0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
120b0 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
120c0 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
120d0 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
120e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
120f0 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  SY;.  }.#endif /
12100 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
12110 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12120 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  S */.  return rc
12130 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  ;.}.../*.** Lowe
12140 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
12150 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
12160 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
12170 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
12180 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
12190 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
121a0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
121b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
121c0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
121d0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
121e0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
121f0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
12200 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
12210 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
12220 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
12230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12240 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  flockUnlock(sqli
12250 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12260 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
12270 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12280 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12290 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
122a0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
122b0 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
122c0 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
122d0 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
122e0 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
122f0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
12300 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
12310 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
12320 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
12330 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
12340 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
12350 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
12360 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12370 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
12380 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12390 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
123a0 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
123b0 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
123c0 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
123d0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
123e0 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    if (eFileLock=
123f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
12400 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
12410 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
12420 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12430 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
12440 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20   /* no, really, 
12450 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28  unlock. */.  if(
12460 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
12470 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
12480 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
12490 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
124a0 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
124b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
124c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
124d0 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
124e0 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
124f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12500 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
12510 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
12520 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
12530 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
12540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
12560 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
12570 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65  c int flockClose
12580 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12590 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
125a0 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  .    flockUnlock
125b0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
125c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73   }.  return clos
125d0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
125e0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
125f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
12600 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
12610 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  XWORK */../*****
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
12630 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20  nd of the flock 
12640 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
12650 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
12660 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
126c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
12710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12720 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20  *** Begin Named 
12730 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e  Semaphore Lockin
12740 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
12750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
12760 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
12770 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
12780 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78   supported on Vx
12790 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d  Works..**.** Sem
127a0 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
127b0 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20  s like dot-lock 
127c0 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61  and flock in tha
127d0 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  t it really only
127e0 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43  .** supports EXC
127f0 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20  LUSIVE locking. 
12800 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   Only a single p
12810 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20  rocess can read 
12820 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20  or write.** the 
12830 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
12840 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
12850 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c  educes potential
12860 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75   concurrency, bu
12870 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c  t.** makes the l
12880 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
12890 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a  on much easier..
128a0 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
128b0 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  S../*.** This ro
128c0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
128d0 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
128e0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
128f0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
12900 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
12910 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
12920 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
12930 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
12940 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
12950 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
12960 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
12970 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
12980 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
12990 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
129a0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
129b0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
129c0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
129d0 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
129e0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43  .static int semC
129f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
12a00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12a10 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
12a20 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
12a30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
12a40 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
12a50 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12a60 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12a70 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
12a80 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
12a90 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
12aa0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
12ab0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12ac0 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
12ad0 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
12ae0 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
12af0 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
12b00 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
12b10 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
12b20 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
12b30 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
12b40 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
12b50 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
12b60 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
12b70 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
12b80 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d  erved ){.    sem
12b90 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
12ba0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
12bb0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
12bc0 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66  statBuf;..    if
12bd0 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
12be0 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  em)==-1 ){.     
12bf0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
12c00 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45  rno;.      if( E
12c10 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20  AGAIN != tErrno 
12c20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12c30 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12c40 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
12c50 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
12c60 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
12c70 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  );.        pFile
12c80 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
12c90 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c  rrno;.      } el
12ca0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  se {.        /* 
12cb0 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73  someone else has
12cc0 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77   the lock when w
12cd0 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b  e are in NO_LOCK
12ce0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
12cf0 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65  rved = (pFile->e
12d00 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45  FileLock < SHARE
12d10 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
12d20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12d30 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61    /* we could ha
12d40 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74  ve it if we want
12d50 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d   it */.      sem
12d60 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20  _post(pSem);.   
12d70 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
12d80 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
12d90 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e  %d %d %d (sem)\n
12da0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
12db0 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20   reserved));..  
12dc0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
12dd0 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
12de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
12df0 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
12e00 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
12e10 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
12e20 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
12e30 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12e40 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
12e50 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
12e60 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
12e70 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
12e80 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
12e90 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
12ea0 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
12eb0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
12ec0 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
12ed0 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
12ee0 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
12ef0 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
12f00 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
12f10 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
12f20 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
12f30 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
12f40 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
12f50 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
12f60 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
12f70 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
12f80 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
12f90 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
12fa0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
12fb0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
12fc0 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
12fd0 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
12fe0 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
12ff0 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
13000 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
13010 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
13020 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
13030 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
13040 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
13050 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
13060 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
13070 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
13080 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
13090 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65  CLUSIVE.**.** Se
130a0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e  maphore locks on
130b0 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
130c0 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
130d0 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
130e0 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
130f0 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
13100 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
13110 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
13120 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
13130 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
13140 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
13150 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
13160 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
13170 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
13180 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
13190 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
131a0 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
131b0 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
131c0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
131d0 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
131e0 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
131f0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
13200 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b  atic int semLock
13210 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13220 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
13230 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
13240 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13250 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b  e*)id;.  int fd;
13260 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
13270 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
13280 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pSem;.  int rc =
13290 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
132a0 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
132b0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
132c0 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
132d0 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
132e0 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
132f0 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
13300 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
13310 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
13320 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
13330 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13340 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d  leLock;.    rc =
13350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13360 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
13370 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c  k;.  }.  .  /* l
13380 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f  ock semaphore no
13390 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77  w but bail out w
133a0 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b  hen already lock
133b0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d  ed. */.  if( sem
133c0 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d  _trywait(pSem)==
133d0 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  -1 ){.    rc = S
133e0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
133f0 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
13400 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74  k;.  }..  /* got
13410 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
13420 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
13430 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  */.  pFile->eFil
13440 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
13450 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  k;.. sem_end_loc
13460 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k:.  return rc;.
13470 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
13480 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13490 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
134a0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
134b0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
134c0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
134d0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
134e0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
134f0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
13500 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
13510 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
13520 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
13530 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
13540 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
13550 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
13560 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
13570 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
13580 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
13590 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
135a0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
135b0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
135c0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
135d0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
135e0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
135f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
13600 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
13610 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43  pSem );.  OSTRAC
13620 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
13630 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
13640 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
13650 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09  >h, eFileLock,..
13660 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13670 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
13680 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
13690 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
136a0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
136b0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
136c0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
136d0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
136e0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
136f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13700 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
13710 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
13720 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
13730 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
13740 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
13750 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
13760 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
13770 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13780 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
13790 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
137a0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
137b0 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  eally unlock. */
137c0 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74  .  if ( sem_post
137d0 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20  (pSem)==-1 ) {. 
137e0 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e     int rc, tErrn
137f0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
13800 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
13810 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
13820 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
13830 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
13840 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
13850 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
13860 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
13870 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
13880 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
13890 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
138a0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
138b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
138c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
138d0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
138e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
138f0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
13900 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
13910 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
13920 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
13930 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73  xFile*)id;.    s
13940 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  emUnlock(id, NO_
13950 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72  LOCK);.    asser
13960 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  t( pFile );.    
13970 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
13980 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  ;.    releaseIno
13990 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
139a0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
139b0 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  x();.    closeUn
139c0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
139d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
139e0 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
139f0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
13a00 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
13a10 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
13a20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
13a30 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
13a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
13a50 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
13a60 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
13a70 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
13a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 0a 0a  ************/...
13ae0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
13af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
13b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
13b50 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
13b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
13b80 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
13b90 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
13ba0 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
13bb0 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
13bc0 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
13bd0 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
13be0 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
13bf0 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
13c00 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
13c10 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
13c20 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
13c30 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
13c40 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
13c50 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
13c60 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
13c70 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
13c80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
13c90 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
13ca0 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
13cb0 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
13cc0 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
13cd0 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
13ce0 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66  state.*/.typedef
13cf0 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
13d00 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
13d10 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
13d20 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
13d30 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65  ntext {.  int re
13d40 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20  served;.  const 
13d50 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
13d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
13d70 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
13d80 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
13d90 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
13da0 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
13db0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
13dc0 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
13dd0 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
13de0 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
13df0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
13e00 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
13e10 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
13e20 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
13e30 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
13e40 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
13e50 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
13e60 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
13e70 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
13e80 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
13e90 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
13ea0 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
13eb0 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
13ec0 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
13ed0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
13ee0 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
13ef0 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
13f00 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
13f30 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
13f40 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
13f50 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
13f60 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
13f70 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
13f80 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
13f90 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
13fa0 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ckPB2)../*.** Th
13fb0 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
13fc0 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63  for setting or c
13fd0 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61  learing a bit-ra
13fe0 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a  nge lock on an.*
13ff0 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  * AFP filesystem
14000 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ..** .** Return 
14010 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
14020 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53  cess, SQLITE_BUS
14030 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  Y on failure..*/
14040 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53  .static int afpS
14050 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
14060 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
14070 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
14080 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
14090 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c  be locked or unl
140a0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46  ocked */.  unixF
140b0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
140c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
140d0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
140e0 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75  r on path */.  u
140f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
14100 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a  g offset,     /*
14110 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   First byte to b
14120 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  e locked */.  un
14130 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
14140 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20   length,     /* 
14150 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
14160 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
14170 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20   setLockFlag    
14180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14190 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e  rue to set lock.
141a0 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72    False to clear
141b0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
141c0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
141d0 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20  ckPB2 pb;.  int 
141e0 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
141f0 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
14200 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
14210 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
14220 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
14230 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
14240 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
14250 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
14260 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52  le->h;.  .  OSTR
14270 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
14280 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
14290 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
142a0 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
142b0 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
142c0 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
142d0 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
142e0 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
142f0 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
14300 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
14310 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
14320 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
14330 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
14340 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
14350 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
14360 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
14370 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
14380 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64  FPSETLOCK failed
14390 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
143a0 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
143b0 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45          path, tE
143c0 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
143d0 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66  Errno)));.#ifdef
143e0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
143f0 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
14400 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
14410 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
14420 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
14430 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
14440 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
14450 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
14460 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
14470 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
14480 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
14490 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
144a0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
144b0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
144c0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
144d0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
144e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
144f0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
14500 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
14510 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
14520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14530 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
14540 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
14550 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
14560 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
14570 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
14580 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
14590 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
145a0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
145b0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
145c0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
145d0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
145e0 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
145f0 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
14600 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
14610 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
14620 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
14630 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
14640 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
14650 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
14660 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
14670 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
14680 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
14690 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
146a0 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
146b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
146c0 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
146d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
146e0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
146f0 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74  id;.  .  Simulat
14700 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
14710 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
14720 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
14730 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
14740 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c   pFile );.  afpL
14750 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
14760 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
14770 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
14780 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
14790 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74  text;.  if( cont
147a0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
147b0 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  .    *pResOut = 
147c0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
147d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
147e0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
147f0 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
14800 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
14810 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
14820 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68  ds */.  .  /* Ch
14830 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
14840 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
14850 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
14860 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
14870 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
14880 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
14890 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
148a0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
148b0 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
148c0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
148d0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
148e0 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65    */.  if( !rese
148f0 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  rved ){.    /* l
14900 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44  ock the RESERVED
14910 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74   byte */.    int
14920 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
14930 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
14940 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
14950 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20  ED_BYTE, 1,1);  
14960 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
14970 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20  OK==lrc ){.     
14980 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
14990 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
149a0 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
149b0 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
149c0 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
149d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
149e0 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  e */.      lrc =
149f0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
14a00 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
14a10 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
14a20 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
14a30 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
14a40 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  if we failed to 
14a50 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65  get the lock the
14a60 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  n someone else m
14a70 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20  ust have it */. 
14a80 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
14a90 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
14aa0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
14ab0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  rc) ){.      rc=
14ac0 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lrc;.    }.  }. 
14ad0 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
14ae0 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
14af0 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
14b00 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22  d %d %d (afp)\n"
14b10 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
14b20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20  reserved));.  . 
14b30 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
14b40 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
14b50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
14b60 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
14b70 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
14b80 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
14b90 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
14ba0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
14bb0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
14bc0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
14bd0 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
14be0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
14bf0 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
14c00 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
14c10 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
14c20 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
14c30 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
14c40 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
14c50 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
14c60 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
14c70 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
14c80 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
14c90 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
14ca0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
14cb0 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
14cc0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
14cd0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
14ce0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
14cf0 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
14d00 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
14d10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
14d20 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
14d30 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
14d40 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
14d50 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
14d60 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
14d70 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
14d80 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
14d90 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
14da0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
14db0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
14dc0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
14dd0 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
14de0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14df0 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
14e00 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
14e10 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
14e20 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
14e30 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
14e40 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
14e50 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
14e60 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
14e70 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
14e80 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c   int afpLock(sql
14e90 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14ea0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
14eb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14ec0 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
14ed0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
14ee0 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
14ef0 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
14f00 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
14f10 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
14f20 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
14f30 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
14f40 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
14f50 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a  kingContext;.  .
14f60 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
14f70 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
14f80 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
14f90 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
14fa0 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
14fb0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
14fc0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
14fd0 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
14fe0 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
14ff0 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
15000 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f   azFileLock(pIno
15010 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  de->eFileLock), 
15020 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
15030 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
15040 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
15050 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
15060 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
15070 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
15080 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
15090 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
150a0 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
150b0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  afp_end_lock: ex
150c0 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
150d0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
150e0 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
150f0 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
15100 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
15110 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b  eLock>=eFileLock
15120 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
15130 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
15140 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
15150 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  ) (afp)\n", pFil
15160 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
15170 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
15180 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65  eLock)));.    re
15190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
151a0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
151b0 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
151c0 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
151d0 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ect.  **  (1) We
151e0 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
151f0 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
15200 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
15210 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
15220 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
15230 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
15240 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
15250 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
15260 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
15270 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
15280 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
15290 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
152a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
152b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
152c0 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46  k!=NO_LOCK || eF
152d0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
152e0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
152f0 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e  ( eFileLock!=PEN
15300 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
15310 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
15320 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
15330 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  || pFile->eFileL
15340 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
15350 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73   );.  .  /* This
15360 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
15370 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
15380 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
15390 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
153a0 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
153b0 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
153c0 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
153d0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  e;..  /* If some
153e0 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
153f0 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
15400 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
15410 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
15420 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
15430 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
15440 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
15450 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
15460 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  f( (pFile->eFile
15470 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46  Lock!=pInode->eF
15480 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20  ileLock && .    
15490 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
154a0 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
154b0 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
154c0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
154d0 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20      ){.    rc = 
154e0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
154f0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
15500 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
15510 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
15520 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
15530 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
15540 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
15550 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
15560 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
15570 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
15580 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
15590 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
155a0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
155b0 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
155c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
155d0 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
155e0 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
155f0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
15600 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  || pInode->eFile
15610 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
15620 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
15630 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
15640 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
15650 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
15660 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
15670 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
15680 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29  ode->nShared>0 )
15690 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ;.    pFile->eFi
156a0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
156b0 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
156c0 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20  ->nShared++;.   
156d0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
156e0 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
156f0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20  nd_lock;.  }.   
15700 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47   .  /* A PENDING
15710 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
15720 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
15730 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
15740 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
15750 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
15760 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
15770 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
15780 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
15790 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
157a0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sed..  */.  if( 
157b0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
157c0 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
157d0 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43   (eFileLock==EXC
157e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
157f0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
15800 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
15810 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  ){.    int faile
15820 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20  d;.    failed = 
15830 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
15840 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15850 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
15860 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28   1, 1);.    if (
15870 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20  failed) {.      
15880 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
15890 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
158a0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
158b0 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72    .  /* If contr
158c0 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
158d0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
158e0 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
158f0 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
15900 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
15910 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
15920 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
15930 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
15940 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
15950 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72      int lrc1, lr
15960 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20  c2, lrc1Errno;. 
15970 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b     long lk, mask
15980 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72  ;.    .    asser
15990 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
159a0 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
159b0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
159c0 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
159d0 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d       .    mask =
159e0 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d   (sizeof(long)==
159f0 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54  8) ? LARGEST_INT
15a00 36 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b  64 : 0x7fffffff;
15a10 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
15a20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48  the read-lock SH
15a30 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  ARED_LOCK */.   
15a40 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68   /* note that th
15a50 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65  e quality of the
15a60 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73   randomness does
15a70 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20  n't matter that 
15a80 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d  much */.    lk =
15a90 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20   random(); .    
15aa0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
15ab0 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29  te = (lk & mask)
15ac0 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
15ad0 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61  1);.    lrc1 = a
15ae0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15af0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
15b00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41  , .          SHA
15b10 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
15b20 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
15b30 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f   1);.    if( IS_
15b40 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
15b50 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72   ){.      lrc1Er
15b60 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  rno = pFile->las
15b70 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
15b80 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
15b90 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
15ba0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32  lock */.    lrc2
15bb0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
15bc0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
15bd0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
15be0 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a  TE, 1, 0);.    .
15bf0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15c00 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a  ERROR(lrc1) ) {.
15c10 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
15c20 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72  tErrno = lrc1Err
15c30 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  no;.      rc = l
15c40 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc1;.      goto 
15c50 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
15c60 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f    } else if( IS_
15c70 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29  LOCK_ERROR(lrc2)
15c80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
15c90 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc2;.      goto 
15ca0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
15cb0 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63    } else if( lrc
15cc0 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  1 != SQLITE_OK )
15cd0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72   {.      rc = lr
15ce0 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  c1;.    } else {
15cf0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
15d00 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
15d10 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e  _LOCK;.      pIn
15d20 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
15d30 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
15d40 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  red = 1;.    }. 
15d50 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
15d60 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
15d70 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e  LOCK && pInode->
15d80 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
15d90 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
15da0 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
15db0 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
15dc0 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
15dd0 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20  is.     ** same 
15de0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
15df0 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
15e00 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
15e10 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15e20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
15e30 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
15e40 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
15e50 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
15e60 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
15e70 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
15e80 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
15e90 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
15ea0 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
15eb0 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
15ec0 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  */.    int faile
15ed0 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  d = 0;.    asser
15ee0 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69  t( 0!=pFile->eFi
15ef0 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  leLock );.    if
15f00 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52   (eFileLock >= R
15f10 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
15f20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15f30 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b   < RESERVED_LOCK
15f40 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  ) {.        /* A
15f50 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45  cquire a RESERVE
15f60 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  D lock */.      
15f70 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
15f80 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
15f90 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
15fa0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
15fb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61  );.      if( !fa
15fc0 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
15fd0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
15fe0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
15ff0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61     }.    if (!fa
16000 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63  iled && eFileLoc
16010 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  k == EXCLUSIVE_L
16020 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20  OCK) {.      /* 
16030 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
16040 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  SIVE lock */.   
16050 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52       .      /* R
16060 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64  emove the shared
16070 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79   lock before try
16080 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20  ing the range.  
16090 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20  we'll need to . 
160a0 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c       ** reestabl
160b0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
160c0 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20  ock if we can't 
160d0 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f  get the  afpUnlo
160e0 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ck.      */.    
160f0 20 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d    if( !(failed =
16100 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16110 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16120 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
16130 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
16140 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f              pIno
16150 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
16160 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 0)) ){.      
16170 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20    int failed2 = 
16180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
16190 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d     /* now attemm
161a0 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78  pt to get the ex
161b0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e  clusive lock ran
161c0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ge */.        fa
161d0 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
161e0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
161f0 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
16200 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20  _FIRST, .       
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
16230 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  IZE, 1);.       
16240 20 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28   if( failed && (
16250 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74  failed2 = afpSet
16260 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
16270 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16290 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
162a0 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72  T + pInode->shar
162b0 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29  edByte, 1, 1)) )
162c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
162d0 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68  an't reestablish
162e0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
162f0 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20  .  Sqlite can't 
16300 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20  deal, this is.  
16310 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69          ** a cri
16320 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a  tical I/O error.
16330 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
16340 20 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61         rc = ((fa
16350 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f  iled & SQLITE_IO
16360 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
16370 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20  OERR) ? failed2 
16380 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  : .             
16390 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c    SQLITE_IOERR_L
163a0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  OCK;.          g
163b0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
163c0 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  ;.        } .   
163d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
163e0 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a    rc = failed; .
163f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16400 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a    if( failed ){.
16410 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
16420 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  d;.    }.  }.  .
16430 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16440 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
16450 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
16460 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e  ileLock;.    pIn
16470 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
16480 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65   eFileLock;.  }e
16490 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
164a0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
164b0 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
164c0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
164d0 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  ING_LOCK;.    pI
164e0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
164f0 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
16500 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c    }.  .afp_end_l
16510 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
16520 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
16530 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
16540 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20  %s %s (afp)\n", 
16550 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
16560 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
16570 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53   .         rc==S
16580 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
16590 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
165a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
165b0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
165c0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
165d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
165e0 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
165f0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
16600 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
16610 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
16620 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
16630 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
16640 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
16650 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
16660 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
16670 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
16680 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
16690 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
166a0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
166b0 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63  tic int afpUnloc
166c0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
166d0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
166e0 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  k) {.  int rc = 
166f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
16700 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
16710 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
16720 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
16730 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b  Inode;.  afpLock
16740 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
16750 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
16760 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
16770 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
16780 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61  t;.  int skipSha
16790 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  red = 0;.#ifdef 
167a0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
167b0 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  t h = pFile->h;.
167c0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
167d0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
167e0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
167f0 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25  d %d was %d(%d,%
16800 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
16810 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
16820 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
16830 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16840 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
16850 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ode->eFileLock, 
16860 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
16870 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20  Shared,.        
16880 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a     getpid()));..
16890 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
168a0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
168b0 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
168c0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
168d0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
168e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
168f0 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
16900 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
16910 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
16920 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
16930 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
16940 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
16950 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
16960 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
16970 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
16980 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
16990 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69  leLock );.    Si
169a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
169b0 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
169c0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
169d0 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
169e0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
169f0 30 29 3b 0a 20 20 20 20 0a 23 69 66 6e 64 65 66  0);.    .#ifndef
16a00 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57   NDEBUG.    /* W
16a10 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
16a20 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
16a30 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
16a40 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
16a50 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
16a60 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
16a70 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
16a80 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
16a90 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
16aa0 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
16ab0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
16ac0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
16ad0 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
16ae0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
16af0 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
16b00 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
16b10 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
16b20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
16b30 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
16b40 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
16b50 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
16b60 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
16b70 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
16b80 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
16b90 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
16ba0 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
16bb0 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
16bc0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
16bd0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
16be0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
16bf0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
16c00 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
16c10 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30  ile->dbUpdate==0
16c20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
16c30 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
16c40 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46  hng==1 );.    pF
16c50 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
16c60 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
16c70 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c     .    if( pFil
16c80 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  e->eFileLock==EX
16c90 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
16ca0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
16cb0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16cc0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
16cd0 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52  ARED_FIRST, SHAR
16ce0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
16cf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16d00 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
16d10 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16d20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
16d30 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ed>1) ){.       
16d40 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61   /* only re-esta
16d50 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
16d60 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61   lock if necessa
16d70 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
16d80 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
16d90 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
16da0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
16db0 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  te;.        rc =
16dc0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16dd0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16de0 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
16df0 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
16e00 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
16e10 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31    skipShared = 1
16e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16e30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16e40 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
16e50 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
16e60 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
16e70 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
16e80 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16e90 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
16ea0 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
16eb0 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
16ec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
16ed0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
16ee0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
16ef0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
16f00 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
16f10 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16f20 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16f30 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
16f40 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  E, 1, 0);.      
16f50 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20  if( !rc ){ .    
16f60 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
16f70 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20  erved = 0; .    
16f80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
16f90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16fa0 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
16fb0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
16fc0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
16fd0 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
16fe0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
16ff0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
17000 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
17010 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65  LITE_OK && eFile
17020 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
17030 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
17040 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
17050 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
17060 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
17070 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
17080 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
17090 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
170a0 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
170b0 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
170c0 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
170d0 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67      */.    unsig
170e0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
170f0 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
17100 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
17110 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
17120 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
17130 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
17140 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
17150 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c  0 ){.      Simul
17160 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17170 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
17180 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
17190 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
171a0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
171b0 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  (0);.      if( !
171c0 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20  skipShared ){.  
171d0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
171e0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
171f0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
17200 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
17210 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
17220 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
17230 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
17240 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
17250 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
17260 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
17270 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
17280 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
17290 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
172a0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
172b0 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
172c0 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
172d0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
172e0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
172f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
17300 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
17310 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
17320 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
17330 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
17340 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17350 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  K ) pFile->eFile
17360 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
17370 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17380 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
17390 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41  file & cleanup A
173a0 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b  FP specific lock
173b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a  ing context .*/.
173c0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c  static int afpCl
173d0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
173e0 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
173f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17400 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
17410 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
17420 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
17430 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c     afpUnlock(id,
17440 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75   NO_LOCK);.    u
17450 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
17460 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
17470 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d  pInode && pFile-
17480 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
17490 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
174a0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
174b0 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
174c0 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
174d0 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
174e0 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61       ** yet beca
174f0 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
17500 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
17510 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
17520 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
17530 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
17540 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67  pInode->aPending
17550 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
17560 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
17570 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ed when.      **
17580 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
17590 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  s cleared..     
175a0 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e   */.      setPen
175b0 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
175c0 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
175d0 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
175e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
175f0 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
17600 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  gContext);.    r
17610 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
17620 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  e(id);.    unixL
17630 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
17640 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17650 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
17660 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
17670 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
17680 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
17690 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
176a0 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
176b0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
176c0 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
176d0 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
176e0 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
176f0 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
17700 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
17710 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
17720 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
17730 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
17740 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
17750 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
17760 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
17770 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
17780 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
17790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
177a0 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
177b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
177c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177d0 2a 2a 2a 2a 0a 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 2a 2a  ****************
177f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17800 2a 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 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
17830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17870 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
17880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17890 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b  * Begin NFS Lock
178a0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
178b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178c0 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  ****/..#if defin
178d0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
178e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
178f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
17900 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
17910 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
17920 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
17930 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
17940 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a  k.  eFileLock. *
17950 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
17960 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
17970 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a  ED_LOCK.. **. **
17980 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
17990 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
179a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
179b0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
179c0 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75  low. ** the requ
179d0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
179e0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
179f0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a  e is a no-op.. *
17a00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73  /.static int nfs
17a10 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
17a20 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
17a30 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72  leLock){.  retur
17a40 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
17a50 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
17a60 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
17a70 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
17a80 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
17a90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
17aa0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
17ab0 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
17ac0 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
17ad0 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
17ae0 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
17af0 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
17b00 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
17b10 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
17b20 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
17b30 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
17b40 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
17b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b60 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
17b70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
17b80 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
17b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
17ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2f 0a 0a 2f 2a 2a  **********/../**
17bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
17c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
17c50 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
17c60 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
17c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
17c90 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
17ca0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
17cb0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
17cc0 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
17cd0 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
17ce0 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
17cf0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
17d00 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
17d10 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
17d20 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
17d30 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
17d40 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
17d50 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
17d60 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
17d70 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
17d80 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
17d90 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
17da0 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
17db0 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
17dc0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
17dd0 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
17de0 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
17df0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
17e00 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
17e10 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
17e20 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
17e30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
17e40 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
17e50 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
17e60 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
17e70 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
17e80 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
17e90 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
17ea0 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
17eb0 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
17ec0 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
17ed0 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
17ee0 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
17ef0 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
17f00 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
17f10 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
17f20 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20  ** any any form 
17f30 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77  by default, we w
17f40 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
17f50 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
17f60 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20  _SOURCE..** See 
17f70 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e  tickets #2741 an
17f80 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54  d #2681..**.** T
17f90 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
17fa0 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
17fb0 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61   on a failed rea
17fc0 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  d the lastErrno 
17fd0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
17fe0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
17ff0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18000 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78  seekAndRead(unix
18010 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  File *id, sqlite
18020 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20  3_int64 offset, 
18030 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
18040 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
18050 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
18060 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
18070 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
18080 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
18090 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
180a0 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64  MER_START;.#if d
180b0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
180c0 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73  ).  do{ got = os
180d0 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
180e0 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
180f0 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26   }while( got<0 &
18100 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
18110 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
18120 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
18130 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
18140 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f  SE_PREAD64).  do
18150 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36  { got = osPread6
18160 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
18170 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68  nt, offset); }wh
18180 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
18190 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 20 20 53  rno==EINTR);.  S
181a0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
181b0 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73  got = -1 );.#els
181c0 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20  e.  newOffset = 
181d0 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66  lseek(id->h, off
181e0 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  set, SEEK_SET);.
181f0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18200 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
18210 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65  ;.  if( newOffse
18220 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  t!=offset ){.   
18230 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d   if( newOffset =
18240 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28  = -1 ){.      ((
18250 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
18260 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
18270 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18280 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
18290 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
182a0 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20  0;....    }.    
182b0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
182c0 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61   do{ got = osRea
182d0 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
182e0 6e 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74  nt); }while( got
182f0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
18300 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  TR );.#endif.  T
18310 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20  IMER_END;.  if( 
18320 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75  got<0 ){.    ((u
18330 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18340 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18350 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
18360 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35  "READ    %-3d %5
18370 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
18380 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66   id->h, got, off
18390 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  set, TIMER_ELAPS
183a0 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  ED));.  return g
183b0 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  ot;.}../*.** Rea
183c0 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69  d data from a fi
183d0 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  le into a buffer
183e0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
183f0 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79  _OK if all.** by
18400 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75  tes were read su
18410 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53  ccessfully and S
18420 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61  QLITE_IOERR if a
18430 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
18440 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
18450 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20   int unixRead(. 
18460 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
18470 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  d, .  void *pBuf
18480 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
18490 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
184a0 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69  fset.){.  unixFi
184b0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
184c0 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
184d0 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28  t got;.  assert(
184e0 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   id );..  /* If 
184f0 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
18500 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
18510 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
18520 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
18530 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
18540 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
18550 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
18560 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
18570 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
18580 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
18590 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
185a0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
185b0 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
185c0 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
185d0 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
185e0 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
185f0 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b  if..  got = seek
18600 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f  AndRead(pFile, o
18610 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
18620 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d  );.  if( got==am
18630 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
18640 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
18650 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  se if( got<0 ){.
18660 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
18670 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52   set by seekAndR
18680 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ead */.    retur
18690 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
186a0 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
186b0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
186c0 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61  no = 0; /* not a
186d0 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f   system error */
186e0 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
186f0 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
18700 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
18710 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
18720 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
18730 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74  uf)[got], 0, amt
18740 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72  -got);.    retur
18750 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
18760 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d  HORT_READ;.  }.}
18770 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
18780 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64  the offset in id
18790 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65  ->offset then re
187a0 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74  ad cnt bytes int
187b0 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72  o pBuf..** Retur
187c0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
187d0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
187e0 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65  ead.  Update the
187f0 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54   offset..**.** T
18800 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
18810 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
18820 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69   on a failed wri
18830 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  te the lastErrno
18840 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
18850 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
18860 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
18870 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e   seekAndWrite(un
18880 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  ixFile *id, i64 
18890 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f  offset, const vo
188a0 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
188b0 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23  t){.  int got;.#
188c0 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45  if (!defined(USE
188d0 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69  _PREAD) && !defi
188e0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
188f0 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ).  i64 newOffse
18900 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  t;.#endif.  TIME
18910 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66  R_START;.#if def
18920 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
18930 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77    do{ got = osPw
18940 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  rite(id->h, pBuf
18950 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20  , cnt, offset); 
18960 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
18970 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
18980 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
18990 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f  SE_PREAD64).  do
189a0 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65  { got = osPwrite
189b0 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  64(id->h, pBuf, 
189c0 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68  cnt, offset);}wh
189d0 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
189e0 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c  rno==EINTR);.#el
189f0 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  se.  newOffset =
18a00 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
18a10 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
18a20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
18a30 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20  or( newOffset-- 
18a40 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73  );.  if( newOffs
18a50 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20  et!=offset ){.  
18a60 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20    if( newOffset 
18a70 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28  == -1 ){.      (
18a80 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
18a90 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
18aa0 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  o;.    }else{.  
18ab0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18ac0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
18ad0 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20   0;....    }.   
18ae0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
18af0 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 57 72    do{ got = osWr
18b00 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ite(id->h, pBuf,
18b10 20 63 6e 74 29 3b 20 7d 77 68 69 6c 65 28 20 67   cnt); }while( g
18b20 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ot<0 && errno==E
18b30 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20  INTR );.#endif. 
18b40 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66   TIMER_END;.  if
18b50 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28  ( got<0 ){.    (
18b60 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
18b70 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
18b80 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  o;.  }..  OSTRAC
18b90 45 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64  E(("WRITE   %-3d
18ba0 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
18bb0 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20  n", id->h, got, 
18bc0 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
18bd0 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72  APSED));.  retur
18be0 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n got;.}.../*.**
18bf0 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
18c00 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
18c10 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
18c20 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
18c30 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
18c40 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
18c50 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
18c60 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72  tatic int unixWr
18c70 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
18c80 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73  ile *id, .  cons
18c90 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20  t void *pBuf, . 
18ca0 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
18cb0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
18cc0 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20   .){.  unixFile 
18cd0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
18ce0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72  le*)id;.  int wr
18cf0 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ote = 0;.  asser
18d00 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
18d10 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f  t( amt>0 );..  /
18d20 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
18d30 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
18d40 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73  t a journal, mas
18d50 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ter-journal or t
18d60 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20  emp.  ** file), 
18d70 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
18d80 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73   locking range s
18d90 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
18da0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
18db0 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
18dc0 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  t( pFile->pUnuse
18dd0 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
18de0 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
18df0 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
18e00 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
18e10 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
18e20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
18e30 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20   NDEBUG.  /* If 
18e40 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
18e50 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
18e60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
18e70 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
18e80 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
18e90 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
18ea0 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
18eb0 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
18ec0 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
18ed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
18ee0 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
18ef0 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
18f00 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
18f10 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
18f20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
18f30 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
18f40 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
18f50 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
18f60 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
18f70 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
18f80 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
18f90 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
18fa0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
18fb0 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
18fc0 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
18fd0 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
18fe0 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
18ff0 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
19000 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
19010 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19020 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
19030 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
19040 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
19050 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
19060 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19070 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
19080 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
19090 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
190a0 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
190b0 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
190c0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
190d0 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
190e0 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
190f0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
19100 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
19110 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19120 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
19130 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
19140 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
19150 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
19160 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b  pBuf, amt))>0 ){
19170 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
19180 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  e;.    offset +=
19190 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
191a0 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
191b0 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
191c0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
191d0 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d  ( wrote=(-1), am
191e0 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61  t=1 ));.  Simula
191f0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
19200 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31  ( wrote=0, amt=1
19210 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e   ));..  if( amt>
19220 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f  0 ){.    if( wro
19230 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c  te<0 && pFile->l
19240 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43  astErrno!=ENOSPC
19250 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
19260 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
19270 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
19280 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19290 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
192a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
192b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
192c0 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
192d0 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
192e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
192f0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
19300 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
19310 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
19320 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
19330 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
19340 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
19350 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
19360 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
19370 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
19380 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
19390 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
193a0 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
193b0 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
193c0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
193d0 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
193e0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
193f0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
19400 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
19410 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
19420 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
19430 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
19440 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
19450 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
19460 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
19470 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
19480 6c 6f 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a  lower) fsync()..
19490 2a 2a 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74  ** If you know t
194a0 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20  hat your system 
194b0 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61  does support fda
194c0 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74  tasync() correct
194d0 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70  ly,.** then simp
194e0 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ly compile with 
194f0 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74  -Dfdatasync=fdat
19500 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65  async.*/.#if !de
19510 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
19520 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c   && !defined(__l
19530 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65  inux__).# define
19540 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63   fdatasync fsync
19550 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
19560 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
19570 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64  SYNC to 0 or 1 d
19580 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
19590 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
195a0 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61  e F_FULLFSYNC ma
195b0 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20  cro is defined. 
195c0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20   F_FULLFSYNC is 
195d0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c  currently.** onl
195e0 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  y available on M
195f0 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68  ac OS X.  But th
19600 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e  at could change.
19610 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c  .*/.#ifdef F_FUL
19620 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  LFSYNC.# define 
19630 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31  HAVE_FULLFSYNC 1
19640 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
19650 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30  HAVE_FULLFSYNC 0
19660 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
19670 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74  The fsync() syst
19680 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74  em call does not
19690 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69   work as adverti
196a0 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75  sed on many.** u
196b0 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68  nix systems.  Th
196c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63  e following proc
196d0 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65  edure is an atte
196e0 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69  mpt to make.** i
196f0 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a  t work better..*
19700 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
19710 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69  NO_SYNC macro di
19720 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63  sables all fsync
19730 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ()s.  This is us
19740 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74  eful.** for test
19750 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74  ing when we want
19760 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20   to run through 
19770 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71  the test suite q
19780 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61  uickly..** You a
19790 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69  re strongly advi
197a0 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70  sed *not* to dep
197b0 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f  loy with SQLITE_
197c0 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c  NO_SYNC.** enabl
197d0 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e  ed, however, sin
197e0 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  ce with SQLITE_N
197f0 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20  O_SYNC enabled, 
19800 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f  an OS crash.** o
19810 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  r power failure 
19820 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72  will likely corr
19830 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65  upt the database
19840 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
19850 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74  ite sets the dat
19860 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68  aOnly flag if th
19870 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
19880 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  le is unchanged.
19890 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68  .** The idea beh
198a0 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20  ind dataOnly is 
198b0 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f  that it should o
198c0 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69  nly write the fi
198d0 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f  le content.** to
198e0 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69   disk, not the i
198f0 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73  node.  We only s
19900 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74  et dataOnly if t
19910 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  he file size is 
19920 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69  .** unchanged si
19930 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  nce the file siz
19940 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
19950 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72   inode.  However
19960 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74  , .** Ted Ts'o t
19970 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61  ells us that fda
19980 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c  tasync() will al
19990 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f  so write the ino
199a0 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c  de if the.** fil
199b0 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67  e size has chang
199c0 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65  ed.  The only re
199d0 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  al difference be
199e0 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28  tween fdatasync(
199f0 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29  ).** and fsync()
19a00 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20  , Ted tells us, 
19a10 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e  is that fdatasyn
19a20 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75  c() will not flu
19a30 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20  sh the.** inode 
19a40 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20  if the mtime or 
19a50 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69  owner or other i
19a60 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20  node attributes 
19a70 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  have changed..**
19a80 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62   We only care ab
19a90 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a  out the file siz
19aa0 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72  e, not the other
19ab0 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73   file attributes
19ac0 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61  , so.** as far a
19ad0 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63  s SQLite is conc
19ae0 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73  erned, an fdatas
19af0 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20  ync() is always 
19b00 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c  adequate..** So,
19b10 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66   we always use f
19b20 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74  datasync() if it
19b30 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
19b40 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20  egardless of.** 
19b50 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
19b60 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a   dataOnly flag..
19b70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75  */.static int fu
19b80 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c  ll_fsync(int fd,
19b90 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69   int fullSync, i
19ba0 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20  nt dataOnly){.  
19bb0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
19bc0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64  e following "ifd
19bd0 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62  ef/elif/else/" b
19be0 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d  lock has the sam
19bf0 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20  e structure as. 
19c00 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f   ** the one belo
19c10 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61  w. It is replica
19c20 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20  ted here solely 
19c30 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72  to avoid clutter
19c40 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ing .  ** up the
19c50 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20   real code with 
19c60 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  the UNUSED_PARAM
19c70 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20  ETER() macros.. 
19c80 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
19c90 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53  E_NO_SYNC.  UNUS
19ca0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
19cb0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
19cc0 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
19cd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
19ce0 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
19cf0 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
19d00 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
19d10 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
19d20 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
19d30 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
19d40 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
19d50 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
19d60 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
19d70 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
19d80 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
19d90 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66  we do a normal f
19da0 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a  sync() and .  **
19db0 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73   FULLSYNC.  This
19dc0 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
19dd0 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66  testing to verif
19de0 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63  y that this proc
19df0 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20  edure.  ** gets 
19e00 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
19e10 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74  correct argument
19e20 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
19e30 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
19e40 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69   fullSync ) sqli
19e50 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
19e60 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt++;.  sqlite3_
19e70 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
19e80 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
19e90 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
19ea0 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
19eb0 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
19ec0 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
19ed0 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
19ee0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
19ef0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
19f00 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
19f10 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c  LFSYNC.  if( ful
19f20 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
19f30 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f  = osFcntl(fd, F_
19f40 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20  FULLFSYNC, 0);. 
19f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
19f60 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20   1;.  }.  /* If 
19f70 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61  the FULLFSYNC fa
19f80 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20  iled, fall back 
19f90 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  to attempting an
19fa0 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49   fsync()..  ** I
19fb0 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70  t shouldn't be p
19fc0 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c  ossible for full
19fd0 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e  fsync to fail on
19fe0 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a   the local .  **
19ff0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e   file system (on
1a000 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72   OSX), so failur
1a010 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
1a020 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20   FULLFSYNC.  ** 
1a030 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
1a040 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79  for this file sy
1a050 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70  stem. So, attemp
1a060 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a  t an fsync .  **
1a070 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69   and (for now) i
1a080 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65  gnore the overhe
1a090 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75  ad of a superflu
1a0a0 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20  ous fcntl call. 
1a0b0 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62   .  ** It'd be b
1a0c0 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74 20  etter to detect 
1a0d0 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72  fullfsync suppor
1a0e0 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64  t once and avoid
1a0f0 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c   .  ** the fcntl
1a100 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65   call every time
1a110 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e   sync is called.
1a120 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29  .  */.  if( rc )
1a130 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1a140 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ..#elif defined(
1a150 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20  __APPLE__).  /* 
1a160 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48  fdatasync() on H
1a170 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20  FS+ doesn't yet 
1a180 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20 73  flush the file s
1a190 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67 65  ize if it change
1a1a0 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
1a1b0 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65   so currently we
1a1c0 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20   default to the 
1a1d0 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64 65 66  macro that redef
1a1e0 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20 74  ines fdatasync t
1a1f0 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72  o fsync.  */.  r
1a200 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23  c = fsync(fd);.#
1a210 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61  else .  rc = fda
1a220 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20  tasync(fd);.#if 
1a230 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
1a240 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f   rc==-1 && errno
1a250 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20  ==ENOTSUP ){.   
1a260 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1a270 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  .  }.#endif /* O
1a280 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e  S_VXWORKS */.#en
1a290 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
1a2a0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66  ITE_NO_SYNC elif
1a2b0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1a2c0 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57  */..  if( OS_VXW
1a2d0 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20  ORKS && rc!= -1 
1a2e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
1a2f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a300 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1a310 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
1a320 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
1a330 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
1a340 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1a350 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
1a360 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
1a370 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
1a380 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
1a390 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
1a3a0 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
1a3b0 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
1a3c0 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
1a3d0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
1a3e0 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
1a3f0 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
1a400 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
1a410 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
1a420 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
1a430 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
1a440 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
1a450 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
1a460 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
1a470 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
1a480 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
1a490 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
1a4a0 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
1a4b0 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
1a4c0 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
1a4d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1a4e0 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
1a4f0 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
1a500 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
1a510 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
1a520 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
1a530 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
1a540 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
1a550 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
1a560 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
1a570 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
1a580 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
1a590 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1a5a0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
1a5b0 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
1a5c0 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
1a5d0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1a5e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a5f0 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
1a600 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
1a610 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
1a620 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1a630 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1a640 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
1a650 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
1a660 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
1a670 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
1a680 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
1a690 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1a6a0 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
1a6b0 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
1a6c0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
1a6d0 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
1a6e0 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
1a6f0 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
1a700 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
1a710 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
1a720 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1a730 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
1a740 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
1a750 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
1a760 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
1a770 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
1a780 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
1a790 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
1a7a0 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
1a7b0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
1a7c0 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
1a7d0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1a7e0 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
1a7f0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
1a800 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1a810 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
1a820 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
1a830 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
1a840 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70  c = full_fsync(p
1a850 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73  File->h, isFulls
1a860 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29  ync, isDataOnly)
1a870 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1a880 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1a890 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
1a8a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1a8b0 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1a8c0 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1a8d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
1a8e0 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c  C, "full_fsync",
1a8f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1a900 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d    }.  if( pFile-
1a910 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20  >dirfd>=0 ){.   
1a920 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53 59   OSTRACE(("DIRSY
1a930 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75  NC %-3d (have_fu
1a940 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
1a950 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
1a960 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20  e->dirfd,.      
1a970 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
1a980 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63  SYNC, isFullsync
1a990 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ));.#ifndef SQLI
1a9a0 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
1a9b0 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  NC.    /* The di
1a9c0 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
1a9d0 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
1a9e0 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a  f full_fsync is.
1a9f0 20 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66      ** turned of
1aa00 66 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65  f or unavailable
1aa10 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79  .  If a full_fsy
1aa20 6e 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76  nc occurred abov
1aa30 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  e,.    ** then t
1aa40 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  he directory syn
1aa50 63 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73  c is superfluous
1aa60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1aa70 20 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e   (!HAVE_FULLFSYN
1aa80 43 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63  C || !isFullsync
1aa90 29 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28  ) && full_fsync(
1aaa0 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30  pFile->dirfd,0,0
1aab0 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20  ) ){.       /*. 
1aac0 20 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65        ** We have
1aad0 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70   received multip
1aae0 6c 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66 73  le reports of fs
1aaf0 79 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67 0a  ync() returning.
1ab00 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73         ** errors
1ab10 20 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74 6f   when applied to
1ab20 20 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e 20   directories on 
1ab30 63 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79 73  certain file sys
1ab40 74 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20  tems..       ** 
1ab50 41 20 66 61 69 6c 65 64 20 64 69 72 65 63 74 6f  A failed directo
1ab60 72 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20 61  ry sync is not a
1ab70 20 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20 69   big deal.  So i
1ab80 74 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20 2a  t seems.       *
1ab90 2a 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e 6f  * better to igno
1aba0 72 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20 54  re the error.  T
1abb0 69 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20 20  icket #1657.    
1abc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20     */.       /* 
1abd0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1abe0 20 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20   = errno; */.   
1abf0 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51      /* return SQ
1ac00 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20  LITE_IOERR; */. 
1ac10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1ac20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  /* Only need to 
1ac30 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20 63 6c  sync once, so cl
1ac40 6f 73 65 20 74 68 65 20 20 64 69 72 65 63 74 6f  ose the  directo
1ac50 72 79 20 77 68 65 6e 20 77 65 20 61 72 65 20 64  ry when we are d
1ac60 6f 6e 65 20 2a 2f 0a 20 20 20 20 72 6f 62 75 73  one */.    robus
1ac70 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
1ac80 46 69 6c 65 2d 3e 64 69 72 66 64 2c 20 5f 5f 4c  File->dirfd, __L
1ac90 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c  INE__);.    pFil
1aca0 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  e->dirfd = -1;. 
1acb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1acc0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
1acd0 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
1ace0 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
1acf0 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
1ad00 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71   unixTruncate(sq
1ad10 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1ad20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  i64 nByte){.  un
1ad30 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1ad40 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
1ad50 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1ad60 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
1ad70 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1ad80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1ad90 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a  ERR_TRUNCATE );.
1ada0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
1adb0 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
1adc0 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
1add0 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
1ade0 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
1adf0 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
1ae00 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
1ae10 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
1ae20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
1ae30 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
1ae40 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
1ae50 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
1ae60 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
1ae70 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
1ae80 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
1ae90 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1aea0 6b 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  k ){.    nByte =
1aeb0 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65   ((nByte + pFile
1aec0 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70  ->szChunk - 1)/p
1aed0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a  File->szChunk) *
1aee0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b   pFile->szChunk;
1aef0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62  .  }..  rc = rob
1af00 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1af10 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e  ile->h, (off_t)n
1af20 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Byte);.  if( rc 
1af30 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
1af40 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1af50 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1af60 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1af70 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1af80 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1af90 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
1afa0 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  lse{.#ifndef NDE
1afb0 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  BUG.    /* If we
1afc0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1afd0 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1afe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1aff0 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20   opposed to.    
1b000 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1b010 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1b020 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1b030 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1b040 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d  an a.    ** norm
1b050 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1b060 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74  ) and we truncat
1b070 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1b080 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a  ro length,.    *
1b090 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65  * that effective
1b0a0 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1b0b0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20  hange counter.  
1b0c0 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1b0d0 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65  n.    ** when re
1b0e0 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61  storing a databa
1b0f0 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63  se using the bac
1b100 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a  kup API from a z
1b110 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ero-length.    *
1b120 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f  * source..    */
1b130 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
1b140 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
1b150 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
1b160 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
1b170 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
1b180 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
1b190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b1a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1b1b0 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
1b1c0 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
1b1d0 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
1b1e0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1b1f0 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
1b200 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
1b210 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1b220 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1b230 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
1b240 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  );.  rc = osFsta
1b250 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
1b260 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
1b270 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1b280 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1b290 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  !=0 ){.    ((uni
1b2a0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
1b2b0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1b2c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b2d0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1b2e0 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
1b2f0 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
1b300 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
1b310 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
1b320 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65  e, the findInode
1b330 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65  Info() procedure
1b340 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73  .  ** writes a s
1b350 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20  ingle byte into 
1b360 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64  that file in ord
1b370 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  er to work aroun
1b380 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20  d a bug.  ** in 
1b390 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66  the OS-X msdos f
1b3a0 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f  ilesystem.  In o
1b3b0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72  rder to avoid pr
1b3c0 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65  oblems with uppe
1b3d0 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77  r.  ** layers, w
1b3e0 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74  e need to report
1b3f0 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20   this file size 
1b400 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f  as zero even tho
1b410 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72  ugh it is.  ** r
1b420 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65  eally 1.   Ticke
1b430 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20  t #3260..  */.  
1b440 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20  if( *pSize==1 ) 
1b450 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20  *pSize = 0;...  
1b460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b470 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1b480 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1b490 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1b4a0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
1b4b0 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f   Handler for pro
1b4c0 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d  xy-locking file-
1b4d0 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20  control verbs.  
1b4e0 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e  Defined below in
1b4f0 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67   the.** proxying
1b500 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f   locking divisio
1b510 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1b520 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1b530 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  l(sqlite3_file*,
1b540 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64  int,void*);.#end
1b550 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  if../* .** This 
1b560 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1b570 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
1b580 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1b590 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65  ZE_HINT .** file
1b5a0 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69  -control operati
1b5b0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
1b5c0 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
1b5d0 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
1b5e0 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
1b5f0 20 69 74 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20   it could be.** 
1b600 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6e 65  that the file ne
1b610 65 64 73 20 74 6f 20 62 65 20 65 78 74 65 6e 64  eds to be extend
1b620 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
1b630 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
1b640 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  .** SQLITE_FCNTL
1b650 5f 53 49 5a 45 5f 48 49 4e 54 20 6f 70 65 72 61  _SIZE_HINT opera
1b660 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
1b670 66 6f 72 20 55 6e 69 78 2e 0a 2a 2f 0a 73 74 61  for Unix..*/.sta
1b680 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a  tic int fcntlSiz
1b690 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a  eHint(unixFile *
1b6a0 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65  pFile, i64 nByte
1b6b0 29 7b 0a 20 20 7b 20 2f 2a 20 70 72 65 73 65 72  ){.  { /* preser
1b6c0 76 65 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20 6f  ve indentation o
1b6d0 66 20 72 65 6d 6f 76 65 64 20 22 69 66 22 20 2a  f removed "if" *
1b6e0 2f 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b  /.    i64 nSize;
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b700 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1b710 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
1b720 20 69 36 34 20 73 7a 43 68 75 6e 6b 3b 20 20 20   i64 szChunk;   
1b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b740 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a  * Chunk size */.
1b750 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
1b760 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  buf;            
1b770 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c    /* Used to hol
1b780 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  d return values 
1b790 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20  of fstat() */.  
1b7a0 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61   .    if( osFsta
1b7b0 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
1b7c0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1b7d0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a  E_IOERR_FSTAT;..
1b7e0 20 20 20 20 73 7a 43 68 75 6e 6b 20 3d 20 70 46      szChunk = pF
1b7f0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
1b800 20 20 69 66 28 20 73 7a 43 68 75 6e 6b 3d 3d 30    if( szChunk==0
1b810 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
1b820 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 65 6c  = nByte;.    }el
1b830 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20  se{.      nSize 
1b840 3d 20 28 28 6e 42 79 74 65 2b 73 7a 43 68 75 6e  = ((nByte+szChun
1b850 6b 2d 31 29 20 2f 20 73 7a 43 68 75 6e 6b 29 20  k-1) / szChunk) 
1b860 2a 20 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 7d  * szChunk;.    }
1b870 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28  .    if( nSize>(
1b880 69 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20  i64)buf.st_size 
1b890 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ){..#if defined(
1b8a0 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
1b8b0 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f  CATE) && HAVE_PO
1b8c0 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20  SIX_FALLOCATE.  
1b8d0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
1b8e0 62 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e  below is handlin
1b8f0 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
1b900 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74  ue of osFallocat
1b910 65 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  e() .      ** co
1b920 72 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66  rrectly. posix_f
1b930 61 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65  allocate() is de
1b940 66 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e  fined to "return
1b950 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  s zero on succes
1b960 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  s, .      ** or 
1b970 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20  an error number 
1b980 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65  on  failure". Se
1b990 65 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f  e the manpage fo
1b9a0 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20  r details. */.  
1b9b0 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20      int err;.   
1b9c0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65     do{.        e
1b9d0 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65  rr = osFallocate
1b9e0 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73  (pFile->h, buf.s
1b9f0 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75  t_size, nSize-bu
1ba00 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20  f.st_size);.    
1ba10 20 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45    }while( err==E
1ba20 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66  INTR );.      if
1ba30 28 20 65 72 72 20 29 20 72 65 74 75 72 6e 20 53  ( err ) return S
1ba40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
1ba50 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f  E;.#else.      /
1ba60 2a 20 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73  * If the OS does
1ba70 20 6e 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f   not have posix_
1ba80 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b  fallocate(), fak
1ba90 65 20 69 74 2e 20 46 69 72 73 74 20 75 73 65 0a  e it. First use.
1baa0 20 20 20 20 20 20 2a 2a 20 66 74 72 75 6e 63 61        ** ftrunca
1bab0 74 65 28 29 20 74 6f 20 73 65 74 20 74 68 65 20  te() to set the 
1bac0 66 69 6c 65 20 73 69 7a 65 2c 20 74 68 65 6e 20  file size, then 
1bad0 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 62  write a single b
1bae0 79 74 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  yte to.      ** 
1baf0 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e  the last byte in
1bb00 20 65 61 63 68 20 62 6c 6f 63 6b 20 77 69 74 68   each block with
1bb10 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64 20  in the extended 
1bb20 72 65 67 69 6f 6e 2e 20 54 68 69 73 0a 20 20 20  region. This.   
1bb30 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d     ** is the sam
1bb40 65 20 74 65 63 68 6e 69 71 75 65 20 75 73 65 64  e technique used
1bb50 20 62 79 20 67 6c 69 62 63 20 74 6f 20 69 6d 70   by glibc to imp
1bb60 6c 65 6d 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c  lement posix_fal
1bb70 6c 6f 63 61 74 65 28 29 0a 20 20 20 20 20 20 2a  locate().      *
1bb80 2a 20 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61  * on systems tha
1bb90 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20  t do not have a 
1bba0 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29  real fallocate()
1bbb0 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 20 20   system call..  
1bbc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
1bbd0 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62   nBlk = buf.st_b
1bbe0 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65  lksize;  /* File
1bbf0 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69  -system block si
1bc00 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  ze */.      i64 
1bc10 69 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  iWrite;         
1bc20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1bc30 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  offset to write 
1bc40 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  to */..      if(
1bc50 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1bc60 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a  e(pFile->h, nSiz
1bc70 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  e) ){.        pF
1bc80 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1bc90 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
1bca0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1bcb0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1bcc0 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
1bcd0 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
1bce0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
1bcf0 20 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 28       iWrite = ((
1bd00 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a  buf.st_size + 2*
1bd10 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a  nBlk - 1)/nBlk)*
1bd20 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 77 68  nBlk-1;.      wh
1bd30 69 6c 65 28 20 69 57 72 69 74 65 3c 6e 53 69 7a  ile( iWrite<nSiz
1bd40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
1bd50 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e   nWrite = seekAn
1bd60 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57  dWrite(pFile, iW
1bd70 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20  rite, "", 1);.  
1bd80 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
1bd90 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
1bda0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1bdb0 0a 20 20 20 20 20 20 20 20 69 57 72 69 74 65 20  .        iWrite 
1bdc0 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d  += nBlk;.      }
1bdd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1bde0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1bdf0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1be00 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  Information and 
1be10 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70  control of an op
1be20 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
1be30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1be40 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  ixFileControl(sq
1be50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1be60 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1be70 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  rg){.  unixFile 
1be80 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1be90 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68  le*)id;.  switch
1bea0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1beb0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
1bec0 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20  CKSTATE: {.     
1bed0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
1bee0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b  File->eFileLock;
1bef0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1bf00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1bf10 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
1bf20 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
1bf30 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1bf40 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1bf50 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
1bf60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1bf70 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1bf80 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a  _FCNTL_CHUNK_SIZ
1bf90 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  E: {.      pFile
1bfa0 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e  ->szChunk = *(in
1bfb0 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  t *)pArg;.      
1bfc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bfd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1bfe0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1bff0 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20  ZE_HINT: {.     
1c000 20 72 65 74 75 72 6e 20 66 63 6e 74 6c 53 69 7a   return fcntlSiz
1c010 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69  eHint(pFile, *(i
1c020 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  64 *)pArg);.    
1c030 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1c040 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
1c050 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  WAL: {.      int
1c060 20 62 50 65 72 73 69 73 74 20 3d 20 2a 28 69 6e   bPersist = *(in
1c070 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69  t*)pArg;.      i
1c080 66 28 20 62 50 65 72 73 69 73 74 3c 30 20 29 7b  f( bPersist<0 ){
1c090 0a 20 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29  .        *(int*)
1c0a0 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63  pArg = (pFile->c
1c0b0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
1c0c0 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 29  ILE_PERSIST_WAL)
1c0d0 21 3d 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  !=0;.      }else
1c0e0 20 69 66 28 20 62 50 65 72 73 69 73 74 3d 3d 30   if( bPersist==0
1c0f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1c100 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
1c110 7e 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53  ~UNIXFILE_PERSIS
1c120 54 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d 65 6c  T_WAL;.      }el
1c130 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  se{.        pFil
1c140 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
1c150 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
1c160 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _WAL;.      }.  
1c170 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c180 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  E_OK;.    }.#ifn
1c190 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
1c1a0 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c  * The pager call
1c1b0 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  s this method to
1c1c0 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20   signal that it 
1c1d0 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20  has done.    ** 
1c1e0 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74  a rollback and t
1c1f0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1c200 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e   is therefore un
1c210 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20  changed and.    
1c220 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69  ** it hence it i
1c230 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61  s OK for the tra
1c240 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20  nsaction change 
1c250 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20  counter to be.  
1c260 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a    ** unchanged..
1c270 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1c280 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1c290 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20  UNCHANGED: {.   
1c2a0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1c2b0 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  d)->dbUpdate = 0
1c2c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c2d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c2e0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1c2f0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1c300 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1c310 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
1c320 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54   case SQLITE_SET
1c330 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a  _LOCKPROXYFILE:.
1c340 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c350 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
1c360 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E: {.      retur
1c370 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  n proxyFileContr
1c380 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a  ol(id,op,pArg);.
1c390 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1c3a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1c3b0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1c3c0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1c3d0 29 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51  ) */.    case SQ
1c3e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f  LITE_FCNTL_SYNC_
1c3f0 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20 20 20  OMITTED: {.     
1c400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c410 4b 3b 20 20 2f 2a 20 41 20 6e 6f 2d 6f 70 20 2a  K;  /* A no-op *
1c420 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  /.    }.  }.  re
1c430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
1c440 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
1c450 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
1c460 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
1c470 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
1c480 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
1c490 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
1c4a0 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
1c4b0 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
1c4c0 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
1c4d0 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
1c4e0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
1c4f0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
1c500 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
1c510 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
1c520 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
1c530 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
1c540 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
1c550 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
1c560 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
1c570 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
1c580 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
1c590 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
1c5a0 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
1c5b0 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1c5c0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
1c5d0 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
1c5e0 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
1c5f0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1c600 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
1c610 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
1c620 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
1c630 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1c640 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
1c650 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1c660 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
1c670 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
1c680 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
1c690 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e  ways 0 for unix.
1c6a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1c6b0 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
1c6c0 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
1c6d0 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b  _file *NotUsed){
1c6e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1c6f0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
1c700 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
1c710 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c720 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  _WAL.../*.** Obj
1c730 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
1c740 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
1c750 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
1c760 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
1c770 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
1c780 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
1c790 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
1c7a0 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
1c7b0 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
1c7c0 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
1c7d0 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
1c7e0 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
1c7f0 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
1c800 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
1c810 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1c820 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
1c830 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
1c840 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
1c850 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
1c860 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1c870 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
1c880 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
1c890 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
1c8a0 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
1c8b0 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
1c8c0 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
1c8d0 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
1c8e0 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
1c8f0 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
1c900 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
1c910 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
1c920 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
1c930 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
1c940 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
1c950 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
1c960 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
1c970 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
1c980 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1c990 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
1c9a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
1c9b0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1c9c0 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
1c9d0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1c9e0 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
1c9f0 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
1ca00 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
1ca10 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
1ca20 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
1ca30 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
1ca40 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
1ca50 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
1ca60 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
1ca70 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
1ca80 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
1ca90 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1caa0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
1cab0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
1cac0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
1cad0 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
1cae0 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
1caf0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
1cb00 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
1cb10 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
1cb20 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
1cb30 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
1cb40 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
1cb50 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
1cb60 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1cb70 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
1cb80 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
1cb90 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
1cba0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
1cbb0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
1cbc0 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
1cbd0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
1cbe0 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
1cbf0 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
1cc00 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
1cc10 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
1cc20 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
1cc30 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
1cc40 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
1cc50 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1cc60 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
1cc70 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc90 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
1cca0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
1ccb0 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
1ccc0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1ccd0 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
1cce0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
1ccf0 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
1cd00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1cd10 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
1cd20 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
1cd30 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
1cd40 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
1cd50 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
1cd60 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
1cd70 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
1cd80 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
1cd90 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1cda0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
1cdd0 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
1cde0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
1cdf0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
1ce00 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
1ce10 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
1ce20 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
1ce30 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
1ce40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1ce50 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
1ce60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1ce70 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1ce80 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1ce90 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
1cea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1ceb0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1cec0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
1ced0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
1cee0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1cef0 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
1cf00 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
1cf10 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
1cf20 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
1cf30 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
1cf40 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
1cf50 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
1cf60 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
1cf70 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
1cf80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1cf90 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1cfa0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
1cfb0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
1cfc0 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
1cfd0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
1cfe0 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
1cff0 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
1d000 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
1d010 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
1d020 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1d030 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
1d040 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
1d050 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
1d060 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
1d070 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
1d080 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
1d090 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
1d0a0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1d0b0 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
1d0c0 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
1d0d0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
1d0e0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
1d0f0 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
1d100 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
1d110 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
1d120 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
1d130 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
1d140 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1d150 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
1d160 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
1d170 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  x */.  u16 share
1d180 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1d190 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1d1a0 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1d1b0 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
1d1c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1d1d0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
1d1e0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
1d1f0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1d200 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20  DEBUG.  u8 id;  
1d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d220 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
1d230 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
1d240 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f  in its unixShmNo
1d250 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
1d260 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
1d270 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1d280 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  g.*/.#define UNI
1d290 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  X_SHM_BASE   ((2
1d2a0 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
1d2b0 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f  CK)*4)         /
1d2c0 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
1d2d0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  e */.#define UNI
1d2e0 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e  X_SHM_DMS    (UN
1d2f0 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IX_SHM_BASE+SQLI
1d300 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
1d310 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
1d320 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
1d330 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
1d340 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79  locks for all by
1d350 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68  tes from ofst th
1d360 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a  rough ofst+n-1..
1d370 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63  **.** Locks bloc
1d380 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73  k if the mask is
1d390 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48   exactly UNIX_SH
1d3a0 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d  M_C and are non-
1d3b0 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65  blocking.** othe
1d3c0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
1d3d0 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74   int unixShmSyst
1d3e0 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68  emLock(.  unixSh
1d3f0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c  mNode *pShmNode,
1d400 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20   /* Apply locks 
1d410 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61  to this open sha
1d420 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
1d430 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  nt */.  int lock
1d440 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Type,          /
1d450 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c  * F_UNLCK, F_RDL
1d460 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a  CK, or F_WRLCK *
1d470 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1d480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1d490 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
1d4a0 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f  locking range */
1d4b0 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20  .  int n        
1d4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d4d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1d4e0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
1d4f0 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20  uct flock f;    
1d500 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20     /* The posix 
1d510 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67  advisory locking
1d520 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1d530 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d540 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  OK;   /* Result 
1d550 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28  code form fcntl(
1d560 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
1d570 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d  s to the unixShm
1d580 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
1d590 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
1d5a0 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
1d5b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d5c0 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
1d5d0 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d  ->mutex) || pShm
1d5e0 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  Node->nRef==0 );
1d5f0 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
1d600 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
1d610 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
1d620 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
1d630 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
1d640 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
1d650 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
1d660 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
1d670 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
1d680 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1d690 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
1d6a0 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
1d6b0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1d6c0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
1d6d0 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d  eters */.    mem
1d6e0 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f  set(&f, 0, sizeo
1d6f0 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74  f(f));.    f.l_t
1d700 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a  ype = lockType;.
1d710 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d      f.l_whence =
1d720 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66   SEEK_SET;.    f
1d730 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b  .l_start = ofst;
1d740 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e  .    f.l_len = n
1d750 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ;..    rc = osFc
1d760 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ntl(pShmNode->h,
1d770 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20   F_SETLK, &f);. 
1d780 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31     rc = (rc!=(-1
1d790 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  )) ? SQLITE_OK :
1d7a0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1d7b0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
1d7c0 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73  he global lock s
1d7d0 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75  tate and do debu
1d7e0 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66  g tracing */.#if
1d7f0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d800 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20  .  { u16 mask;. 
1d810 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1d820 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20  OCK "));.  mask 
1d830 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  = (1<<(ofst+n)) 
1d840 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69  - (1<<ofst);.  i
1d850 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d860 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
1d870 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
1d880 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1d890 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  "unlock %d ok", 
1d8a0 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
1d8b0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
1d8c0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
1d8d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
1d8e0 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1d8f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
1d900 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
1d910 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1d920 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20  (("read-lock %d 
1d930 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1d940 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1d950 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1d960 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1d970 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
1d980 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
1d990 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
1d9a0 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
1d9b0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1d9c0 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
1d9d0 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1d9e0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1d9f0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
1da00 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
1da10 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
1da20 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
1da30 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  e{.    if( lockT
1da40 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
1da50 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1da60 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  unlock %d failed
1da70 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
1da80 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
1da90 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
1daa0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
1dab0 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
1dac0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1dad0 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
1dae0 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
1daf0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1db00 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66  "write-lock %d f
1db10 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
1db20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
1db30 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61  ACE((" - afterwa
1db40 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  rds %03x,%03x\n"
1db50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68  ,.           pSh
1db60 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
1db70 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63  k, pShmNode->exc
1db80 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e  lMask));.  }.#en
1db90 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1dba0 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a  ;        .}.../*
1dbb0 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
1dbc0 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
1dbd0 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
1dbe0 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
1dbf0 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
1dc00 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
1dc10 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1dc20 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
1dc30 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
1dc40 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
1dc50 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1dc60 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
1dc70 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
1dc80 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
1dc90 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
1dca0 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
1dcb0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
1dcc0 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
1dcd0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
1dce0 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66  if( p && p->nRef
1dcf0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
1dd00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
1dd10 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49  >pInode==pFd->pI
1dd20 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  node );.    sqli
1dd30 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
1dd40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f  ->mutex);.    fo
1dd50 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
1dd60 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
1dd70 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
1dd80 20 20 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70          munmap(p
1dd90 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70  ->apRegion[i], p
1dda0 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->szRegion);.   
1ddb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ddc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1ddd0 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a  ->apRegion[i]);.
1dde0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ddf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1de00 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->apRegion);.   
1de10 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
1de20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
1de30 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f  se(pFd, p->h, __
1de40 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70  LINE__);.      p
1de50 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ->h = -1;.    }.
1de60 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70      p->pInode->p
1de70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ShmNode = 0;.   
1de80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1de90 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
1dea0 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  pen a shared-mem
1deb0 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
1dec0 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61  ted with open da
1ded0 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
1dee0 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72  d.  .** This par
1def0 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e  ticular implemen
1df00 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70  tation uses mmap
1df10 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ped files..**.**
1df20 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74   The file used t
1df30 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72  o implement shar
1df40 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20  ed-memory is in 
1df50 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
1df60 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65  ry.** as the ope
1df70 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1df80 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
1df90 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65   name as the ope
1dfa0 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  n database.** fi
1dfb0 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68  le with the "-sh
1dfc0 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e  m" suffix added.
1dfd0 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
1dfe0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1dff0 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65  ile.** is "/home
1e000 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
1e010 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20  " then the file 
1e020 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
1e030 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66  and mmapped.** f
1e040 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
1e050 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
1e060 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e  "/home/user1/con
1e070 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a  fig.db-shm".  .*
1e080 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70  *.** Another app
1e090 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75  roach to is to u
1e0a0 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76  se files in /dev
1e0b0 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70  /shm or /dev/tmp
1e0c0 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f   or an.** some o
1e0d0 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74  ther tmpfs mount
1e0e0 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20  . But if a file 
1e0f0 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64  in a different d
1e100 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d  irectory.** from
1e110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e120 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
1e130 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73   differing acces
1e140 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  s permissions.**
1e150 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d   or a chroot() m
1e160 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64  ight cause two d
1e170 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
1e180 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  es on the same.*
1e190 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e  * database to en
1e1a0 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65  d up using diffe
1e1b0 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73  rent files for s
1e1c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a  hared memory - .
1e1d0 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  ** meaning that 
1e1e0 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75  their memory wou
1e1f0 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  ld not really be
1e200 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74   shared - result
1e210 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61  ing.** in databa
1e220 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
1e230 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68  Nevertheless, th
1e240 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73  is tmpfs file us
1e250 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e  age.** can be en
1e260 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
1e270 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51  -time using -DSQ
1e280 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
1e290 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a  RY="/dev/shm".**
1e2a0 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65   or the equivale
1e2b0 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  nt.  The use of 
1e2c0 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  the SQLITE_SHM_D
1e2d0 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
1e2e0 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20  -time.** option 
1e2f0 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e  results in an in
1e300 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64  compatible build
1e310 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69   of SQLite;  bui
1e320 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a  lds of SQLite.**
1e330 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65   that with diffe
1e340 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f  ring SQLITE_SHM_
1e350 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e  DIRECTORY settin
1e360 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  gs attempt to us
1e370 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61  e the.** same da
1e380 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
1e390 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61  he same time, da
1e3a0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1e3b0 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  n will likely.**
1e3c0 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c   result. The SQL
1e3d0 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
1e3e0 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  Y compile-time o
1e3f0 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65  ption is conside
1e400 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72  red.** "unsuppor
1e410 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20  ted" and may go 
1e420 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65  away in a future
1e430 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e   SQLite release.
1e440 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
1e450 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
1e460 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
1e470 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
1e480 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
1e490 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
1e4a0 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
1e4b0 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
1e4c0 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
1e4d0 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
1e4e0 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
1e4f0 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
1e500 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
1e510 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a  der cleared..**.
1e520 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  ** If the origin
1e530 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1e540 20 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e   (pDbFd) is usin
1e550 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c  g the "unix-excl
1e560 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65  " VFS.** that me
1e570 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c  ans that an excl
1e580 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65  usive lock is he
1e590 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
1e5a0 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74  se file and.** t
1e5b0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
1e5c0 63 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20  cesses are able 
1e5d0 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
1e5e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1e5f0 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c  In.** that case,
1e600 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c   we do not reall
1e610 79 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65  y need shared me
1e620 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64  mory.  No shared
1e630 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20   memory.** file 
1e640 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
1e650 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
1e660 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64  ill be simulated
1e670 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72   with heap memor
1e680 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
1e690 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
1e6a0 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a  emory(unixFile *
1e6b0 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
1e6c0 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b   unixShm *p = 0;
1e6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e6e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1e6f0 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
1e700 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
1e710 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a   *pShmNode;   /*
1e720 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1e730 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
1e740 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e760 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1e770 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
1e780 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
1e790 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f        /* The ino
1e7a0 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68  de of fd */.  ch
1e7b0 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  ar *zShmFilename
1e7c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e7d0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
1e7e0 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a  e used for SHM *
1e7f0 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65  /.  int nShmFile
1e800 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
1e810 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1e820 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20  he SHM filename 
1e830 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f  in bytes */..  /
1e840 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
1e850 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
1e860 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  xShm object. */.
1e870 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
1e880 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
1e890 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
1e8a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1e8b0 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
1e8c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
1e8d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ;.  assert( pDbF
1e8e0 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20  d->pShm==0 );.. 
1e8f0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1e900 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64   if a unixShmNod
1e910 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79  e object already
1e920 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61   exists. Reuse a
1e930 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
1e940 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20  one if present. 
1e950 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
1e960 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
1e970 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
1e980 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
1e990 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
1e9a0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
1e9b0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
1e9c0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d  .  if( pShmNode=
1e9d0 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
1e9e0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ea00 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72  fstat() info for
1ea10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1ea20 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66  /..    /* Call f
1ea30 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65  stat() to figure
1ea40 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73   out the permiss
1ea50 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61  ions on the data
1ea60 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20  base file. If.  
1ea70 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d    ** a new *-shm
1ea80 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
1ea90 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c  , an attempt wil
1eaa0 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65  l be made to cre
1eab0 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69  ate it.    ** wi
1eac0 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  th the same perm
1ead0 69 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74  issions. The act
1eae0 75 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ual permissions 
1eaf0 74 68 65 20 66 69 6c 65 20 69 73 20 63 72 65 61  the file is crea
1eb00 74 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ted.    ** with 
1eb10 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74  are subject to t
1eb20 68 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b  he current umask
1eb30 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f   setting..    */
1eb40 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
1eb50 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61  (pDbFd->h, &sSta
1eb60 74 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50  t) && pInode->bP
1eb70 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
1eb80 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1eb90 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1eba0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1ebb0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
1ebc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
1ebd0 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
1ebe0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nShmFilename = s
1ebf0 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d  izeof(SQLITE_SHM
1ec00 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 30  _DIRECTORY) + 30
1ec10 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d  ;.#else.    nShm
1ec20 46 69 6c 65 6e 61 6d 65 20 3d 20 35 20 2b 20 28  Filename = 5 + (
1ec30 69 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64  int)strlen(pDbFd
1ec40 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66  ->zPath);.#endif
1ec50 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
1ec60 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1ec70 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
1ec80 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ) + nShmFilename
1ec90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d   );.    if( pShm
1eca0 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Node==0 ){.     
1ecb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1ecc0 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
1ecd0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1ece0 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53   }.    memset(pS
1ecf0 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  hmNode, 0, sizeo
1ed00 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b 0a 20  f(*pShmNode));. 
1ed10 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20     zShmFilename 
1ed20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
1ed30 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
1ed40 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66  pShmNode[1];.#if
1ed50 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
1ed60 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c  IRECTORY.    sql
1ed70 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53  ite3_snprintf(nS
1ed80 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d  hmFilename, zShm
1ed90 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20  Filename, .     
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edb0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1edc0 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68  TORY "/sqlite-sh
1edd0 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20  m-%x-%x",.      
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1edf0 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f  u32)sStat.st_ino
1ee00 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f  , (u32)sStat.st_
1ee10 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  dev);.#else.    
1ee20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1ee30 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
1ee40 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73  ShmFilename, "%s
1ee50 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50  -shm", pDbFd->zP
1ee60 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
1ee70 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
1ee80 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46  Fd->zPath, zShmF
1ee90 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  ilename);.#endif
1eea0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  .    pShmNode->h
1eeb0 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64   = -1;.    pDbFd
1eec0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
1eed0 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20  de = pShmNode;. 
1eee0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e     pShmNode->pIn
1eef0 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
1ef00 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
1ef10 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
1ef20 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1ef30 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
1ef40 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
1ef50 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
1ef60 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1ef70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1ef80 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1ef90 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
1efa0 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
1efb0 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
1efc0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
1efd0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68   robust_open(zSh
1efe0 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57  mFilename, O_RDW
1eff0 52 7c 4f 5f 43 52 45 41 54 2c 0a 20 20 20 20 20  R|O_CREAT,.     
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f010 20 20 20 20 20 20 20 20 20 20 28 73 53 74 61 74            (sStat
1f020 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 29  .st_mode & 0777)
1f030 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  );.      if( pSh
1f040 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  mNode->h<0 ){.  
1f050 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1f060 20 2a 7a 52 4f 3b 0a 20 20 20 20 20 20 20 20 7a   *zRO;.        z
1f070 52 4f 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  RO = sqlite3_uri
1f080 5f 70 61 72 61 6d 65 74 65 72 28 70 44 62 46 64  _parameter(pDbFd
1f090 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e  ->zPath, "readon
1f0a0 6c 79 5f 73 68 6d 22 29 3b 0a 20 20 20 20 20 20  ly_shm");.      
1f0b0 20 20 69 66 28 20 7a 52 4f 20 26 26 20 73 71 6c    if( zRO && sql
1f0c0 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
1f0d0 52 4f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RO) ){.         
1f0e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72   pShmNode->h = r
1f0f0 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46  obust_open(zShmF
1f100 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  ilename, O_RDONL
1f110 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 20 20 20 20 28 73 53 74 61 74 2e 73 74         (sStat.st
1f140 5f 6d 6f 64 65 20 26 20 30 37 37 37 29 29 3b 0a  _mode & 0777));.
1f150 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
1f160 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d  de->isReadonly =
1f170 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
1f180 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
1f190 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
1f1a0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
1f1b0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
1f1c0 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
1f1d0 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  en", zShmFilenam
1f1e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
1f1f0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1f200 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f210 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43   }.  .      /* C
1f220 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
1f230 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
1f240 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
1f250 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
1f260 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20       ** If not, 
1f270 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
1f280 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
1f290 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
1f2a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1f2b0 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
1f2c0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1f2d0 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c  hmNode, F_WRLCK,
1f2e0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
1f2f0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1f300 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
1f310 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
1f320 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  mNode->h, 0) ){.
1f330 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
1f340 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1f350 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
1f360 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a  , "ftruncate", z
1f370 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
1f380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f390 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f3a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f3b0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
1f3c0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1f3d0 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49  de, F_RDLCK, UNI
1f3e0 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  X_SHM_DMS, 1);. 
1f3f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f400 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
1f410 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
1f420 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
1f430 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
1f440 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
1f450 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
1f460 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
1f470 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20  ShmNode;.#ifdef 
1f480 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
1f490 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
1f4a0 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
1f4b0 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
1f4c0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
1f4d0 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e  ->pShm = p;.  un
1f4e0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1f4f0 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
1f500 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
1f510 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
1f520 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
1f530 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
1f540 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75  e cover of the u
1f550 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
1f560 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
1f570 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
1f580 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
1f590 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20  unixShm) object 
1f5a0 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
1f5b0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
1f5c0 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
1f5d0 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
1f5e0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
1f5f0 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
1f600 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
1f610 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
1f620 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
1f630 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
1f640 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
1f650 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1f660 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
1f670 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1f680 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1f690 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
1f6a0 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
1f6b0 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
1f6c0 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
1f6d0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1f6e0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1f6f0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1f700 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
1f710 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
1f720 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
1f730 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69  _open_err:.  uni
1f740 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
1f750 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ;       /* This 
1f760 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
1f770 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
1f780 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1f790 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  e(p);.  unixLeav
1f7a0 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
1f7b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f7c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f7d0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1f7e0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
1f7f0 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
1f800 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d   the .** shared-
1f810 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
1f820 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
1f830 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
1f840 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1f850 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ns .** are numbe
1f860 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
1f870 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
1f880 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1f890 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a  n is szRegion .*
1f8a0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
1f8b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1f8c0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
1f8d0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1f8e0 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
1f8f0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
1f900 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1f910 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72   the bExtend par
1f920 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
1f930 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
1f940 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
1f950 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
1f960 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
1f970 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
1f980 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
1f990 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
1f9a0 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
1f9b0 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
1f9c0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
1f9d0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
1f9e0 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20   .** bExtend is 
1f9f0 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
1fa00 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
1fa10 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1fa20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20  has not yet .** 
1fa30 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1fa40 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
1fa50 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1fa60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
1fa70 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1fa80 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1fa90 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
1faa0 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
1fab0 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
1fac0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1fad0 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
1fae0 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1faf0 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64  rocesses .** add
1fb00 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
1fb10 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1fb20 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
1fb30 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
1fb40 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  pped .** memory 
1fb50 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1fb60 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1fb70 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70  c int unixShmMap
1fb80 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1fb90 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
1fba0 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
1fbb0 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
1fbc0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
1fbd0 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
1fbe0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1fbf0 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
1fc00 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
1fc10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fc20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
1fc30 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
1fc40 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20  bExtend,        
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fc60 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
1fc70 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
1fc80 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
1fc90 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
1fca0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
1fcb0 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
1fcc0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
1fcd0 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
1fce0 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  fd;.  unixShm *p
1fcf0 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ;.  unixShmNode 
1fd00 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
1fd10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1fd20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
1fd30 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1fd40 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
1fd50 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
1fd60 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
1fd70 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
1fd80 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
1fd90 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
1fda0 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
1fdb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1fdc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1fdd0 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
1fde0 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
1fdf0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
1fe00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1fe10 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1fe20 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
1fe30 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
1fe40 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
1fe50 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1fe60 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1fe70 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
1fe80 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
1fe90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
1fea0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
1feb0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
1fec0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
1fed0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
1fee0 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
1fef0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
1ff00 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
1ff10 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1ff20 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
1ff30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   ){.    char **a
1ff40 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
1ff50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1ff60 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72  w apRegion[] arr
1ff70 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
1ff80 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
1ff90 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20  )*szRegion;  /* 
1ffa0 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
1ffb0 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
1ffc0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
1ffd0 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
1ffe0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
1fff0 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20  fstat() */..    
20000 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
20010 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
20020 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
20030 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
20040 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
20050 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
20060 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
20070 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
20080 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a  s space..      *
20090 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
200a0 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
200b0 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
200c0 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
200d0 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ile is.      ** 
200e0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
200f0 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
20100 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
20110 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
20120 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f  ( osFstat(pShmNo
20130 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  de->h, &sStat) )
20140 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
20150 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
20160 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  IZE;.        got
20170 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
20180 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
20190 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  if( sStat.st_siz
201a0 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  e<nByte ){.     
201b0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
201c0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
201d0 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
201e0 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20  . If bExtend is 
201f0 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  set to.        *
20200 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61  * false, exit ea
20210 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
20220 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
20230 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
20240 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ned..        **.
20250 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72          ** Alter
20260 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78  natively, if bEx
20270 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20 75 73  tend is true, us
20280 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
20290 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
202a0 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74    ** the request
202b0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
202c0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
202d0 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
202e0 64 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  d ) goto shmpage
202f0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 66  _out;.        if
20300 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  ( robust_ftrunca
20310 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  te(pShmNode->h, 
20320 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20  nByte) ){.      
20330 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
20340 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
20350 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74 72  RR_SHMSIZE, "ftr
20360 75 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20  uncate",.       
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20380 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
20390 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
203a0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
203b0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
203c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
203d0 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
203e0 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
203f0 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
20400 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
20410 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
20420 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a   apNew = (char *
20430 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
20440 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
20450 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28  ode->apRegion, (
20460 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
20470 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
20480 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
20490 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
204a0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
204b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
204c0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
204d0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
204e0 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
204f0 20 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f      while(pShmNo
20500 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
20510 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69  gion){.      voi
20520 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  d *pMem;.      i
20530 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
20540 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  0 ){.        pMe
20550 6d 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52 65  m = mmap(0, szRe
20560 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  gion,.          
20570 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65    pShmNode->isRe
20580 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45  adonly ? PROT_RE
20590 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50  AD : PROT_READ|P
205a0 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20  ROT_WRITE, .    
205b0 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52          MAP_SHAR
205c0 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ED, pShmNode->h,
205d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
205e0 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a 20 20 20 20  on*szRegion.    
205f0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
20600 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49  f( pMem==MAP_FAI
20610 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LED ){.         
20620 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
20630 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
20640 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20  SHMMAP, "mmap", 
20650 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
20660 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
20670 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
20680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
206a0 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f   pMem = sqlite3_
206b0 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29  malloc(szRegion)
206c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
206d0 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  em==0 ){.       
206e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
206f0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
20700 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
20710 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20720 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c      memset(pMem,
20730 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   0, szRegion);. 
20740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
20750 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
20760 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
20770 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 20  n] = pMem;.     
20780 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
20790 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
207a0 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
207b0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
207c0 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
207d0 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e  .    *pp = pShmN
207e0 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52  ode->apRegion[iR
207f0 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b  egion];.  }else{
20800 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
20810 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
20820 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20  ->isReadonly && 
20830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
20840 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
20850 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ONLY;.  sqlite3_
20860 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
20870 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
20880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20890 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
208a0 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
208b0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
208c0 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  gment..**.** Not
208d0 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74  e that the relat
208e0 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
208f0 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55  SHAREd and EXCLU
20900 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20  SIVE locks is a 
20910 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72  little.** differ
20920 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e  ent here than in
20930 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d   posix.  In xShm
20940 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20  Lock(), one can 
20950 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  go from unlocked
20960 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e  .** to shared an
20970 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75  d back or from u
20980 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75  nlocked to exclu
20990 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20  sive and back.  
209a0 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e  But one may.** n
209b0 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65  ot go from share
209c0 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f  d to exclusive o
209d0 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65  r from exclusive
209e0 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73   to shared..*/.s
209f0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
20a00 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
20a10 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
20a20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
20a30 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
20a40 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
20a50 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20a70 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
20a80 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
20a90 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ab0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20ac0 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
20ad0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
20ae0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
20af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
20b00 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
20b10 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
20b20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
20b30 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
20b40 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
20b50 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
20b60 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75  ed memory */.  u
20b70 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  nixShm *p = pDbF
20b80 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
20b90 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
20ba0 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
20bb0 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
20bc0 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20be0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
20bf0 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
20c00 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  gs */.  unixShmN
20c10 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
20c20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a  p->pShmNode;  /*
20c30 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
20c40 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20  file iNode */.  
20c50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20c60 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
20c70 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
20c80 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61  code */.  u16 ma
20c90 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cb0 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
20cc0 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65   to take or rele
20cd0 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
20ce0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
20cf0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
20d00 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
20d10 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
20d20 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
20d30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
20d40 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
20d50 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
20d60 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
20d70 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
20d80 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
20d90 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
20da0 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
20db0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
20dc0 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
20dd0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
20de0 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
20df0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
20e00 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
20e10 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
20e20 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
20e30 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
20e40 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
20e50 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
20e60 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
20e70 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
20e80 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
20e90 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
20ea0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
20eb0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
20ec0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
20ed0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
20ee0 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
20ef0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
20f00 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
20f10 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  ;..  mask = (1<<
20f20 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
20f30 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  ofst);.  assert(
20f40 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
20f50 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
20f60 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
20f70 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
20f80 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
20f90 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
20fa0 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
20fb0 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
20fc0 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
20fd0 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
20fe0 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
20ff0 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
21000 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
21010 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
21020 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
21030 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
21040 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
21050 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
21060 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
21070 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
21080 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
21090 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
210a0 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
210b0 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
210c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
210d0 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
210e0 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
210f0 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
21100 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
21110 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
21120 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
21130 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f  Node, F_UNLCK, o
21140 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
21150 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
21160 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
21170 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
21180 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
21190 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
211a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
211b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
211c0 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
211d0 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
211e0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
211f0 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
21200 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
21210 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
21220 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
21230 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
21240 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
21250 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
21260 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
21270 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
21280 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
21290 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
212a0 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
212b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
212c0 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
212d0 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
212e0 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
212f0 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
21300 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
21310 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
21320 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
21330 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
21340 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
21350 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
21360 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
21370 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
21380 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
21390 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
213a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
213b0 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
213c0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
213d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
213e0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
213f0 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
21400 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
21410 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
21420 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21430 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
21440 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
21450 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
21460 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
21470 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  mNode, F_RDLCK, 
21480 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
21490 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
214a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
214b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
214c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
214d0 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
214e0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
214f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21510 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
21520 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
21530 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
21540 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
21550 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
21560 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
21570 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
21580 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
21590 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
215a0 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
215b0 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
215c0 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
215d0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
215e0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
215f0 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
21600 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
21610 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
21620 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
21630 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
21640 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
21650 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
21660 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
21670 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
21680 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
21690 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
216a0 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
216b0 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
216c0 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
216d0 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
216e0 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
216f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21710 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
21720 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
21730 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_WRLCK, ofst+U
21740 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
21750 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
21760 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21770 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
21780 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
21790 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
217a0 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
217b0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
217c0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
217d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
217e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
217f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
21800 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20  -LOCK shmid-%d, 
21810 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c  pid-%d got %03x,
21820 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
21830 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69      p->id, getpi
21840 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  d(), p->sharedMa
21850 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29  sk, p->exclMask)
21860 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
21870 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
21880 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
21890 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
218a0 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
218b0 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c  mory.  .**.** Al
218c0 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
218d0 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
218e0 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
218f0 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
21900 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
21910 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
21920 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
21930 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
21940 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  ixShmBarrier(.  
21950 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21970 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
21980 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
21990 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  red memory */.){
219a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
219b0 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78 45  TER(fd);.  unixE
219c0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 75  nterMutex();.  u
219d0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
219e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
219f0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
21a00 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
21a10 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
21a20 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
21a30 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
21a40 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
21a50 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68  f there is no sh
21a60 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
21a70 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
21a80 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20  connection then 
21a90 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
21aa0 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
21ab0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
21ac0 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28  nt unixShmUnmap(
21ad0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
21ae0 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
21af0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
21b00 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
21b10 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  le */.  int dele
21b20 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
21b30 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
21b40 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
21b50 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
21b60 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20  unixShm *p;     
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b80 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
21b90 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
21ba0 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
21bb0 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
21bc0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
21bd0 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
21be0 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
21bf0 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  ixShm **pp;     
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21c10 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
21c20 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
21c30 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46  tions */.  unixF
21c40 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
21c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21c60 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
21c70 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
21c80 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69   pDbFd = (unixFi
21c90 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
21ca0 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
21cb0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
21cc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
21cd0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
21ce0 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  de;..  assert( p
21cf0 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
21d00 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
21d10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
21d20 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
21d30 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
21d40 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
21d50 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
21d60 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
21d70 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
21d80 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
21d90 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
21da0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
21db0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
21dc0 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
21dd0 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
21de0 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
21df0 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
21e00 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
21e10 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
21e20 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
21e30 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
21e40 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
21e50 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
21e60 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
21e70 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
21e80 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
21e90 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
21ea0 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
21eb0 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
21ec0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
21ed0 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
21ee0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
21ef0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
21f00 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
21f10 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
21f20 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
21f30 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
21f40 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
21f50 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  && pShmNode->h>=
21f60 30 20 29 20 75 6e 6c 69 6e 6b 28 70 53 68 6d 4e  0 ) unlink(pShmN
21f70 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
21f80 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67  .    unixShmPurg
21f90 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20  e(pDbFd);.  }.  
21fa0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
21fb0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
21fc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65  TE_OK;.}...#else
21fd0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
21fe0 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66  mMap     0.# def
21ff0 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20  ine unixShmLock 
22000 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
22010 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  ixShmBarrier 0.#
22020 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55   define unixShmU
22030 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20  nmap   0.#endif 
22040 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
22050 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
22060 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74  *.** Here ends t
22070 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
22080 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33  n of all sqlite3
22090 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a  _file methods..*
220a0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
220b0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c  ******** End sql
220c0 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64  ite3_file Method
220d0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
220e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
220f0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
22100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22140 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69  /../*.** This di
22150 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
22160 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73  definitions of s
22170 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
22180 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a  s objects that.*
22190 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69  * implement vari
221a0 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ous file locking
221b0 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74   strategies.  It
221c0 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64   also contains d
221d0 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66  efinitions.** of
221e0 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
221f0 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66  ons.  A finder-f
22200 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
22210 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70  to locate the ap
22220 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c  propriate.** sql
22230 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
22240 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72  object for a par
22250 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
22260 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70   file.  The pApp
22270 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  Data.** field of
22280 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73   the sqlite3_vfs
22290 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65   VFS objects are
222a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
222b0 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  be pointers to.*
222c0 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69  * the correct fi
222d0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f  nder-function fo
222e0 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a  r that VFS..**.*
222f0 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75  * Most finder fu
22300 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61  nctions return a
22310 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69   pointer to a fi
22320 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  xed sqlite3_io_m
22330 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
22340 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65  .  The only inte
22350 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66  resting finder-f
22360 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c  unction is autol
22370 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69  ockIoFinder, whi
22380 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74  ch.** looks at t
22390 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79  he filesystem ty
223a0 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20  pe and tries to 
223b0 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c  guess the best l
223c0 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65  ocking.** strate
223d0 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a  gy from that..**
223e0 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66  .** For finder-f
223f0 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62  untion F, two ob
22400 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
22410 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  d:.**.**    (1) 
22420 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d  The real finder-
22430 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
22440 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20  FImpt()"..**.** 
22450 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e     (2) A constan
22460 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  t pointer to thi
22470 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  s function named
22480 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a   just "F"..**.**
22490 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
224a0 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69   the F pointer i
224b0 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41  s used as the pA
224c0 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72  ppData value for
224d0 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e   VFS.** objects.
224e0 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
224f0 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20  this instead of 
22500 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61  letting pAppData
22510 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74   point.** direct
22520 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72  ly at the finder
22530 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20  -function since 
22540 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e  C90 rules preven
22550 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f  t a void*.** fro
22560 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61  m be cast into a
22570 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
22580 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68  r..**.**.** Each
22590 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
225a0 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65  s macro generate
225b0 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a  s two objects:.*
225c0 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73  *.**   *  A cons
225d0 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  tant sqlite3_io_
225e0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63  methods object c
225f0 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20  all METHOD that 
22600 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20  has locking.**  
22610 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53      methods CLOS
22620 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
22630 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a   CKRESLOCK..**.*
22640 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65  *   *  An I/O me
22650 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
22660 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44  tion called FIND
22670 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ER that returns 
22680 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20  a pointer.**    
22690 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20    to the METHOD 
226a0 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72  object in the pr
226b0 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a  evious bullet..*
226c0 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48  /.#define IOMETH
226d0 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48  ODS(FINDER, METH
226e0 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f  OD, VERSION, CLO
226f0 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
22700 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c  , CKLOCK)      \
22710 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
22720 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
22730 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20   METHOD = {     
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
22760 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20     VERSION,     
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22780 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
22790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
227b0 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20    CLOSE,        
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
227d0 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20   xClose */      
227e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
22800 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20   unixRead,      
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22820 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20  xRead */        
22830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22840 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
22850 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20  unixWrite,      
22860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22870 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20  Write */        
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22890 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
228a0 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20  nixTruncate,    
228b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
228c0 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20  runcate */      
228d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
228f0 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  ixSync,         
22900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
22910 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  nc */           
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
22940 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  xFileSize,      
22950 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
22960 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  eSize */        
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22980 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b         \.   LOCK
22990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
229a0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
229b0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229d0 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43        \.   UNLOC
229e0 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
229f0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
22a00 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b       \.   CKLOCK
22a30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22a40 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
22a50 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20  eservedLock */  
22a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a70 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
22a80 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
22a90 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
22aa0 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  trol */         
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ac0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74     \.   unixSect
22ad0 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
22ae0 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
22af0 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
22b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b10 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63    \.   unixDevic
22b20 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
22b30 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70  ,  /* xDeviceCap
22b40 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20  abilities */    
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b60 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61 70   \.   unixShmMap
22b70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22b80 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20    /* xShmMap */ 
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bb0 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  \.   unixShmLock
22bc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22bd0 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20   /* xShmLock */ 
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22c00 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69  .   unixShmBarri
22c10 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
22c20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
22c30 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
22c50 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20     unixShmUnmap 
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c70 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20  * xShmUnmap */  
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c90 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
22ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22cb0 20 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 20 20                  
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
22cf0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
22d00 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46  e3_io_methods *F
22d10 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73  INDER##Impl(cons
22d20 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46  t char *z, unixF
22d30 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55  ile *p){   \.  U
22d40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
22d50 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  z); UNUSED_PARAM
22d60 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20  ETER(p);        
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d80 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65            \.  re
22d90 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20  turn &METHOD;   
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dd0 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20           \.}    
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
22e30 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
22e40 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e  o_methods *(*con
22e50 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74  st FINDER)(const
22e60 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20   char*,unixFile 
22e70 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46  *p)    \.    = F
22e80 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a  INDER##Impl;../*
22e90 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c  .** Here are all
22ea0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
22eb0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
22ec0 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74  ts for each of t
22ed0 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74  he.** locking st
22ee0 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74  rategies.  Funct
22ef0 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e  ions that return
22f00 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
22f10 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72  se methods.** ar
22f20 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a  e also created..
22f30 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  */.IOMETHODS(.  
22f40 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20  posixIoFinder,  
22f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
22f60 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
22f70 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65  e */.  posixIoMe
22f80 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
22f90 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
22fa0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
22fb0 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20  me */.  2,      
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
22fe0 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  ry is enabled */
22ff0 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23010 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
23020 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23040 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
23050 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20    unixUnlock,   
23060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23070 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
23080 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
23090 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20  rvedLock     /* 
230a0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
230b0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ck method */.).I
230c0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f  OMETHODS(.  nolo
230d0 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
230e0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
230f0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
23100 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  .  nolockIoMetho
23110 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ds,          /* 
23120 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
23130 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
23140 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23160 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
23170 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
23180 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  nolockClose,    
23190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
231a0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
231b0 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  nolockLock,     
231c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
231d0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
231e0 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  olockUnlock,    
231f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
23200 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
23210 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
23220 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68  vedLock   /* xCh
23230 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
23240 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
23250 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b  THODS(.  dotlock
23260 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
23270 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
23280 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
23290 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
232a0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ,         /* sql
232b0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
232c0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
232d0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
232e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
232f0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
23300 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74  isabled */.  dot
23310 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
23320 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
23330 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
23340 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
23350 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
23360 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
23370 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
23380 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
23390 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
233a0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
233b0 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b  dLock  /* xCheck
233c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
233d0 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51  hod */.)..#if SQ
233e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
233f0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
23400 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
23410 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  DS(.  flockIoFin
23420 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
23430 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
23440 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  on name */.  flo
23450 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
23460 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
23470 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
23480 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234a0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
234b0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
234c0 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  bled */.  flockC
234d0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
234e0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
234f0 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c  thod */.  flockL
23500 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
23510 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
23520 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e  hod */.  flockUn
23530 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
23540 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
23550 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  thod */.  flockC
23560 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
23570 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
23580 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
23590 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
235a0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d  f OS_VXWORKS.IOM
235b0 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46  ETHODS(.  semIoF
235c0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
235d0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
235e0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
235f0 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20   semIoMethods,  
23600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
23610 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23620 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
23630 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
23640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23650 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
23660 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65  disabled */.  se
23670 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  mClose,         
23680 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
23690 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  e method */.  se
236a0 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
236b0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
236c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
236d0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
236e0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
236f0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
23700 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  mCheckReservedLo
23710 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
23720 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
23730 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
23740 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
23750 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
23760 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
23770 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
23780 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72  S(.  afpIoFinder
23790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
237a0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
237b0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49  n name */.  afpI
237c0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
237d0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
237e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
237f0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
23800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23810 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
23820 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
23830 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73  led */.  afpClos
23840 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23850 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
23860 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b  hod */.  afpLock
23870 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23880 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
23890 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63  od */.  afpUnloc
238a0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
238b0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
238c0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63  hod */.  afpChec
238d0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
238e0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
238f0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
23900 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  */.).#endif../*.
23910 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
23920 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61  king method is a
23930 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20   "super-method" 
23940 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  in the sense tha
23950 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65  t it.** opens se
23960 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73  condary file des
23970 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65  criptors for the
23980 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20   conch and lock 
23990 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20  files and.** it 
239a0 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d  uses proxy, dot-
239b0 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66  file, AFP, and f
239c0 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d  lock() locking m
239d0 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a  ethods on those.
239e0 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ** secondary fil
239f0 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  es.  For this re
23a00 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
23a10 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
23a20 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b  ts.** proxy lock
23a30 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d  ing is located m
23a40 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e  uch further down
23a50 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42   in the file.  B
23a60 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f  ut we need.** to
23a70 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65   go ahead and de
23a80 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33  fine the sqlite3
23a90 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20  _io_methods and 
23aa0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a  finder function.
23ab0 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ** for proxy loc
23ac0 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77  king here.  So w
23ad0 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72  e forward declar
23ae0 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  e the I/O method
23af0 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s..*/.#if define
23b00 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
23b10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
23b20 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74  CKING_STYLE.stat
23b30 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73  ic int proxyClos
23b40 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e(sqlite3_file*)
23b50 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
23b60 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  xyLock(sqlite3_f
23b70 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
23b80 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f  ic int proxyUnlo
23b90 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
23ba0 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
23bb0 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  nt proxyCheckRes
23bc0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
23bd0 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a  3_file*, int*);.
23be0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f  IOMETHODS(.  pro
23bf0 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  xyIoFinder,     
23c00 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
23c10 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
23c20 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f  /.  proxyIoMetho
23c30 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
23c40 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
23c50 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
23c60 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23c80 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
23c90 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
23ca0 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20   proxyClose,    
23cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
23cc0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
23cd0 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20   proxyLock,     
23ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
23cf0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
23d00 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20  proxyUnlock,    
23d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
23d20 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
23d30 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
23d40 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43  vedLock    /* xC
23d50 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
23d60 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
23d70 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b  dif../* nfs lock
23d80 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64  d on OSX 10.3+ d
23d90 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69  oesn't clear wri
23da0 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20  te locks when a 
23db0 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
23dc0 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
23dd0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
23de0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
23df0 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
23e00 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64  ODS(.  nfsIoFind
23e10 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
23e20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
23e30 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
23e40 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fsIoMethods,    
23e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
23e60 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23e70 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
23e80 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
23e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23ea0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
23eb0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e  disabled */.  un
23ec0 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ixClose,        
23ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
23ee0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
23ef0 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
23f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
23f10 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
23f20 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fsUnlock,       
23f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
23f40 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
23f50 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
23f60 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78  edLock      /* x
23f70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23f80 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
23f90 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
23fa0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
23fb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
23fc0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a  CKING_STYLE./* .
23fd0 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
23fe0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
23ff0 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
24000 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
24010 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f   strategy .** fo
24020 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
24030 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20  ile "filePath". 
24040 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73   It then returns
24050 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
24060 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
24070 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
24080 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e  s that strategy.
24090 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66  .**.** This is f
240a0 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a  or MacOSX only..
240b0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
240c0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
240d0 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ds *autolockIoFi
240e0 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73  nderImpl(.  cons
240f0 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
24100 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ,    /* name of 
24110 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24120 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
24130 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20  *pNew           
24140 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  /* open file obj
24150 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74 61  ect for the data
24160 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  base file */.){.
24170 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
24180 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a  truct Mapping {.
24190 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
241a0 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20  zFilesystem;    
241b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
241c0 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d  esystem type nam
241d0 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73  e */.    const s
241e0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
241f0 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f  s *pMethods;   /
24200 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f  * Appropriate lo
24210 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a  cking method */.
24220 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20    } aMap[] = {. 
24230 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26     { "hfs",    &
24240 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
24250 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20  ,.    { "ufs",  
24260 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
24270 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66  s },.    { "afpf
24280 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f  s",  &afpIoMetho
24290 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62  ds },.    { "smb
242a0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
242b0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65  ods },.    { "we
242c0 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f  bdav", &nolockIo
242d0 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
242e0 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69   0, 0 }.  };.  i
242f0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
24300 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
24310 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
24320 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
24330 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
24340 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
24350 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
24360 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
24370 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
24380 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
24390 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
243a0 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
243b0 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
243c0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
243d0 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c    if( statfs(fil
243e0 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  ePath, &fsInfo) 
243f0 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28  != -1 ){.    if(
24400 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20   fsInfo.f_flags 
24410 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a  & MNT_RDONLY ){.
24420 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f        return &no
24430 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
24440 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
24450 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  ; aMap[i].zFiles
24460 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ystem; i++){.   
24470 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
24480 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
24490 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  e, aMap[i].zFile
244a0 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20  system)==0 ){.  
244b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61        return aMa
244c0 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20  p[i].pMethods;. 
244d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
244e0 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63  ..  /* Default c
244f0 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d  ase. Handles, am
24500 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e  ongst others, "n
24510 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62  fs"..  ** Test b
24520 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75  yte-range lock u
24530 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66  sing fcntl(). If
24540 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65   the call succee
24550 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ds, .  ** assume
24560 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73   that the file-s
24570 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50  ystem supports P
24580 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
24590 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  . .  */.  lockIn
245a0 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
245b0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
245c0 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
245d0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
245e0 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
245f0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
24600 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  K;.  if( osFcntl
24610 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
24620 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
24630 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74  1 ) {.    if( st
24640 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
24650 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29  typename, "nfs")
24660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
24670 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64  urn &nfsIoMethod
24680 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  s;.    } else {.
24690 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f        return &po
246a0 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
246b0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
246c0 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b   return &dotlock
246d0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
246e0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
246f0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
24700 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
24710 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
24720 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
24730 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
24740 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
24750 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
24760 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
24770 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
24780 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23  KING_STYLE */..#
24790 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  if OS_VXWORKS &&
247a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
247b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
247c0 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
247d0 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
247e0 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
247f0 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
24800 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
24810 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
24820 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
24830 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
24840 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
24850 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
24860 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
24870 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
24880 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
24890 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79  for VXWorks only
248a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
248b0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
248c0 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
248d0 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
248e0 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
248f0 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
24900 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
24910 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
24920 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
24930 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69    /* the open fi
24940 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  le object */.){.
24950 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
24960 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
24970 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
24980 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
24990 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
249a0 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
249b0 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
249c0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
249d0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
249e0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
249f0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
24a00 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
24a10 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20  }..  /* Test if 
24a20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f  fcntl() is suppo
24a30 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53  rted and use POS
24a40 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a  IX style locks..
24a50 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66    ** Otherwise f
24a60 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
24a70 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
24a80 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c  method..  */.  l
24a90 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
24aa0 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
24ab0 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
24ac0 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
24ad0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
24ae0 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
24af0 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73  _RDLCK;.  if( os
24b00 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46  Fcntl(pNew->h, F
24b10 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
24b20 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72  o)!=-1 ) {.    r
24b30 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
24b40 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
24b50 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49      return &semI
24b60 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
24b70 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
24b80 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
24b90 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
24ba0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
24bb0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
24bc0 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
24bd0 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
24be0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
24bf0 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  KS && SQLITE_ENA
24c00 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24c10 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61  E */../*.** An a
24c20 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72  bstract type for
24c30 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
24c40 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  IO method finder
24c50 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79   function:.*/.ty
24c60 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69  pedef const sqli
24c70 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
24c80 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63  (*finder_type)(c
24c90 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
24ca0 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  ile*);.../******
24cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cf0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
24d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d10 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
24d20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
24d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d40 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
24d50 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
24d60 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
24d70 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
24d80 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
24d90 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
24da0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
24db0 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ze the contents 
24dc0 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  of the unixFile 
24dd0 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
24de0 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a  d to by pId..*/.
24df0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
24e00 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c  nUnixFile(.  sql
24e10 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
24e20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
24e30 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
24e40 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20  .  int h,       
24e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
24e60 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
24e70 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67  or of file being
24e80 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
24e90 20 64 69 72 66 64 2c 20 20 20 20 20 20 20 20 20   dirfd,         
24ea0 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
24eb0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
24ec0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
24ed0 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
24ee0 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
24ef0 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
24f00 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
24f10 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
24f20 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
24f30 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
24f40 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  ened */.  int no
24f50 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
24f60 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e    /* Omit lockin
24f70 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69  g if true */.  i
24f80 6e 74 20 69 73 44 65 6c 65 74 65 2c 20 20 20 20  nt isDelete,    
24f90 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
24fa0 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
24fb0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 61  e */.  int isRea
24fc0 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 2f  dOnly          /
24fd0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 66 69  * True if the fi
24fe0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
24ff0 64 2d 6f 6e 6c 79 20 2a 2f 0a 29 7b 0a 20 20 63  d-only */.){.  c
25000 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
25010 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e  methods *pLockin
25020 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
25030 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
25040 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
25050 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25060 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
25070 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20  w->pInode==NULL 
25080 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74  );..  /* Paramet
25090 65 72 20 69 73 44 65 6c 65 74 65 20 69 73 20 6f  er isDelete is o
250a0 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77 6f  nly used on vxwo
250b0 72 6b 73 2e 20 45 78 70 72 65 73 73 20 74 68 69  rks. Express thi
250c0 73 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20 20  s explicitly .  
250d0 2a 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76 65  ** here to preve
250e0 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  nt compiler warn
250f0 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65  ings about unuse
25100 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  d parameters..  
25110 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
25120 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65 29 3b  METER(isDelete);
25130 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74  ..  /* Usually t
25140 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d  he path zFilenam
25150 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
25160 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
25170 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78  ame. The.  ** ex
25180 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20  ception is when 
25190 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78  opening the prox
251a0 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69  y "conch" file i
251b0 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20  n builds that.  
251c0 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73  ** include the s
251d0 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63  pecial Apple loc
251e0 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a  king styles..  *
251f0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
25200 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
25210 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
25220 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74  G_STYLE.  assert
25230 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
25240 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
25250 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73  '/' .    || pVfs
25260 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69  ->pAppData==(voi
25270 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  d*)&autolockIoFi
25280 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20  nder );.#else.  
25290 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
252a0 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
252b0 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e  e[0]=='/' );.#en
252c0 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
252d0 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
252e0 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
252f0 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d  e));.  pNew->h =
25300 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66   h;.  pNew->dirf
25310 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 70 4e 65  d = dirfd;.  pNe
25320 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65  w->zPath = zFile
25330 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6d 65 6d 63  name;.  if( memc
25340 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22  mp(pVfs->zName,"
25350 75 6e 69 78 2d 65 78 63 6c 22 2c 31 30 29 3d 3d  unix-excl",10)==
25360 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
25370 74 72 6c 46 6c 61 67 73 20 3d 20 55 4e 49 58 46  trlFlags = UNIXF
25380 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 65 6c 73  ILE_EXCL;.  }els
25390 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  e{.    pNew->ctr
253a0 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a  lFlags = 0;.  }.
253b0 20 20 69 66 28 20 69 73 52 65 61 64 4f 6e 6c 79    if( isReadOnly
253c0 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
253d0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
253e0 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  ILE_RDONLY;.  }.
253f0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
25400 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78    pNew->pId = vx
25410 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
25420 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
25430 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29  ( pNew->pId==0 )
25440 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31  {.    noLock = 1
25450 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
25460 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e  E_NOMEM;.  }.#en
25470 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63  dif..  if( noLoc
25480 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  k ){.    pLockin
25490 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b  gStyle = &nolock
254a0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
254b0 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67  se{.    pLocking
254c0 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64  Style = (**(find
254d0 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70  er_type*)pVfs->p
254e0 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61  AppData)(zFilena
254f0 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53  me, pNew);.#if S
25500 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
25510 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f  KING_STYLE.    /
25520 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d  * Cache zFilenam
25530 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e in the locking
25540 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e   context (AFP an
25550 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69  d dotlock overri
25560 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  de) for.    ** p
25570 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74  roxyLock activat
25580 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ion is possible 
25590 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73  (remote proxy is
255a0 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d   based on db nam
255b0 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e  e).    ** zFilen
255c0 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  ame remains vali
255d0 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20  d until file is 
255e0 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f  closed, to suppo
255f0 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  rt */.    pNew->
25600 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
25610 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d   (void*)zFilenam
25620 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  e;.#endif.  }.. 
25630 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
25640 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65  le == &posixIoMe
25650 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65  thods.#if define
25660 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
25670 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
25680 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
25690 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  || pLockingStyle
256a0 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64   == &nfsIoMethod
256b0 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  s.#endif.  ){.  
256c0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
256d0 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
256e0 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
256f0 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
25700 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25710 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25720 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
25730 63 63 75 72 65 64 20 69 6e 20 66 69 6e 64 49 6e  ccured in findIn
25740 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65  odeInfo(), close
25750 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
25760 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d  ptor.      ** im
25770 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72  mediately, befor
25780 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  e releasing the 
25790 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65  mutex. findInode
257a0 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a  Info() may fail.
257b0 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20        ** in two 
257c0 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20  scenarios:.     
257d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28   **.      **   (
257e0 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74  a) A call to fst
257f0 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20  at() failed..   
25800 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61     **   (b) A ma
25810 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20  lloc failed..   
25820 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53     **.      ** S
25830 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20  cenario (b) may 
25840 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68  only occur if th
25850 65 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  e process is hol
25860 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20  ding no other.  
25870 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63      ** file desc
25880 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  riptors open on 
25890 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49  the same file. I
258a0 66 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68  f there were oth
258b0 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  er file.      **
258c0 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20   descriptors on 
258d0 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20  this file, then 
258e0 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20  no malloc would 
258f0 62 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  be required by. 
25900 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64       ** findInod
25910 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73  eInfo(). If this
25920 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74   is the case, it
25930 20 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74   is quite safe t
25940 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a  o close.      **
25950 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69   handle h - as i
25960 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
25970 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f  that no posix lo
25980 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65  cks will be rele
25990 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79  ased.      ** by
259a0 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20   doing so..     
259b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
259c0 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75  scenario (a) cau
259d0 73 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68  sed the error th
259e0 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f  en things are no
259f0 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20  t so safe. The. 
25a00 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74       ** implicit
25a10 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65   assumption here
25a20 20 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61   is that if fsta
25a30 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67  t() fails, thing
25a40 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a  s are in.      *
25a50 2a 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65  * such bad shape
25a60 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61   that dropping a
25a70 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65   lock or two doe
25a80 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68  sn't matter much
25a90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
25aa0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
25ab0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
25ac0 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a  ;.      h = -1;.
25ad0 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
25ae0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
25af0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
25b00 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
25b10 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
25b20 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66  PLE__).  else if
25b30 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
25b40 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
25b50 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c   ){.    /* AFP l
25b60 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
25b70 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
25b80 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
25b90 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
25ba0 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
25bb0 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  text..    */.   
25bc0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
25bd0 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e  xt *pCtx;.    pN
25be0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
25bf0 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69  xt = pCtx = sqli
25c00 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
25c10 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20  of(*pCtx) );.   
25c20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a   if( pCtx==0 ){.
25c30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25c40 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
25c50 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a  se{.      /* NB:
25c60 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74   zFilename exist
25c70 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61  s and remains va
25c80 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  lid until the fi
25c90 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20  le is closed.   
25ca0 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20     ** according 
25cb0 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46  to requirement F
25cc0 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f  11141.  So we do
25cd0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b   not need to mak
25ce0 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
25cf0 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  y of the filenam
25d00 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78  e. */.      pCtx
25d10 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65  ->dbPath = zFile
25d20 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78  name;.      pCtx
25d30 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  ->reserved = 0;.
25d40 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76        srandomdev
25d50 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e  ();.      unixEn
25d60 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
25d70 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
25d80 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
25d90 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20  ->pInode);.     
25da0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25db0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
25dc0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
25dd0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
25de0 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
25df0 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
25e00 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
25e10 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20     h = -1;.     
25e20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61   }.      unixLea
25e30 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20  veMutex();      
25e40 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e    .    }.  }.#en
25e50 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20  dif..  else if( 
25e60 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
25e70 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
25e80 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74  ds ){.    /* Dot
25e90 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  file locking use
25ea0 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
25eb0 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
25ec0 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
25ed0 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b    ** the dotlock
25ee0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a  LockingContext .
25ef0 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
25f00 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20  *zLockFile;.    
25f10 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20  int nFilename;. 
25f20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28     nFilename = (
25f30 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65  int)strlen(zFile
25f40 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a  name) + 6;.    z
25f50 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
25f60 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
25f70 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  c(nFilename);.  
25f80 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d    if( zLockFile=
25f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
25fa0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
25fb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25fc0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
25fd0 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63  (nFilename, zLoc
25fe0 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c  kFile, "%s" DOTL
25ff0 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c  OCK_SUFFIX, zFil
26000 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
26010 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
26020 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69  ontext = zLockFi
26030 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  le;.  }..#if OS_
26040 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69  VXWORKS.  else i
26050 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
26060 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64   == &semIoMethod
26070 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65  s ){.    /* Name
26080 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
26090 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
260a0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
260b0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
260c0 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
260d0 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  semLockingContex
260e0 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69  t.    */.    uni
260f0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
26100 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
26110 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
26120 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
26130 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
26140 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49  OK) && (pNew->pI
26150 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c  node->pSem==NULL
26160 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
26170 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77  *zSemName = pNew
26180 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
26190 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  me;.      int n;
261a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
261b0 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
261c0 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20  NAME, zSemName, 
261d0 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20  "/%s.sem",.     
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261f0 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61    pNew->pId->zCa
26200 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
26210 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53      for( n=1; zS
26220 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
26230 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65  .        if( zSe
26240 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20  mName[n]=='/' ) 
26250 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f  zSemName[n] = '_
26260 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ';.      pNew->p
26270 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65  Inode->pSem = se
26280 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c  m_open(zSemName,
26290 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20   O_CREAT, 0666, 
262a0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  1);.      if( pN
262b0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
262c0 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29   == SEM_FAILED )
262d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
262e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
262f0 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64       pNew->pInod
26300 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d  e->aSemName[0] =
26310 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20   '\0';.      }. 
26320 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
26330 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
26340 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d  endif.  .  pNew-
26350 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  >lastErrno = 0;.
26360 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
26370 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26380 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
26390 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
263a0 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
263b0 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31  E__);.    h = -1
263c0 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69  ;.    unlink(zFi
263d0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44  lename);.    isD
263e0 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  elete = 0;.  }. 
263f0 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20   pNew->isDelete 
26400 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64  = isDelete;.#end
26410 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
26420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
26430 28 20 64 69 72 66 64 3e 3d 30 20 29 20 72 6f 62  ( dirfd>=0 ) rob
26440 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
26450 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  dirfd, __LINE__)
26460 3b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  ;.    if( h>=0 )
26470 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
26480 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
26490 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
264a0 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  New->pMethod = p
264b0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
264c0 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
264d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
264e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
264f0 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
26500 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
26510 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
26520 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
26530 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
26540 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
26550 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
26560 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
26570 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
26580 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
26590 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
265a0 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
265b0 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
265c0 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
265d0 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
265e0 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
265f0 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
26600 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
26610 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
26620 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
26630 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73  onsible for clos
26640 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ing.** the file 
26650 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20  descriptor *pFd 
26660 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a  using close()..*
26670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
26680 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
26690 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
266a0 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69  , int *pFd){.  i
266b0 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20  nt ii;.  int fd 
266c0 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69  = -1;.  char zDi
266d0 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  rname[MAX_PATHNA
266e0 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  ME+1];..  sqlite
266f0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
26700 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d  ATHNAME, zDirnam
26710 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61  e, "%s", zFilena
26720 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69  me);.  for(ii=(i
26730 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61  nt)strlen(zDirna
26740 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69  me); ii>1 && zDi
26750 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20  rname[ii]!='/'; 
26760 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e  ii--);.  if( ii>
26770 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d  0 ){.    zDirnam
26780 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  e[ii] = '\0';.  
26790 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
267a0 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
267b0 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
267c0 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d  0);.    if( fd>=
267d0 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f 43  0 ){.#ifdef FD_C
267e0 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 6f 73 46  LOEXEC.      osF
267f0 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
26800 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f  , osFcntl(fd, F_
26810 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
26820 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
26830 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
26840 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c  OPENDIR %-3d %s\
26850 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65  n", fd, zDirname
26860 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
26870 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74  *pFd = fd;.  ret
26880 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54  urn (fd>=0?SQLIT
26890 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f  E_OK:unixLogErro
268a0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
268b0 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
268c0 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f  zDirname));.}../
268d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
268e0 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74  name of a direct
268f0 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ory in which to 
26900 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69  put temporary fi
26910 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  les..** If no su
26920 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79  itable temporary
26930 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20   file directory 
26940 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
26950 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
26960 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
26970 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72  *unixTempFileDir
26980 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
26990 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
269a0 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
269b0 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
269c0 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
269d0 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
269e0 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20   "/tmp",.     0 
269f0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
26a00 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d  erminator */.  }
26a10 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
26a20 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
26a30 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
26a40 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
26a50 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
26a60 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
26a70 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44  tory;.  if( !azD
26a80 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
26a90 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
26aa0 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  DIR");.  for(i=0
26ab0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
26ac0 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
26ad0 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
26ae0 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28  s[i++]){.    if(
26af0 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
26b00 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53  nue;.    if( osS
26b10 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
26b20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
26b30 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
26b40 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
26b50 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
26b60 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29  Access(zDir, 07)
26b70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
26b80 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
26b90 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a  turn zDir;.}../*
26ba0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
26bb0 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
26bc0 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
26bd0 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
26be0 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
26bf0 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
26c00 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
26c10 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
26c20 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
26c30 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
26c40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
26c50 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
26c60 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
26c70 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
26c80 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
26c90 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
26ca0 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
26cb0 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
26cc0 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
26cd0 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
26ce0 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
26cf0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
26d00 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  , j;.  const cha
26d10 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49  r *zDir;..  /* I
26d20 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
26d30 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
26d40 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
26d50 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
26d60 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
26d70 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
26d80 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
26d90 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
26da0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
26db0 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
26dc0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
26dd0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
26de0 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
26df0 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  zDir = unixTempF
26e00 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20  ileDir();.  if( 
26e10 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d  zDir==0 ) zDir =
26e20 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   ".";..  /* Chec
26e30 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
26e40 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
26e50 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
26e60 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
26e70 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
26e80 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
26e90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
26ea0 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65   */.  if( (strle
26eb0 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e  n(zDir) + strlen
26ec0 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
26ed0 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20  E_PREFIX) + 17) 
26ee0 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
26ef0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
26f00 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
26f10 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
26f20 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
26f30 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -17, zBuf, "%s/"
26f40 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
26f50 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
26f60 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72      j = (int)str
26f70 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
26f80 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
26f90 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
26fa0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
26fb0 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
26fc0 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
26fd0 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
26fe0 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
26ff0 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
27000 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
27010 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
27020 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41  0;.  }while( osA
27030 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
27040 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
27050 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
27060 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
27070 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
27080 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
27090 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
270a0 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
270b0 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
270c0 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
270d0 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
270e0 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
270f0 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
27100 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
27110 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
27120 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
27130 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
27140 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
27150 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
27160 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
27170 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
27180 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
27190 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
271a0 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
271b0 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
271c0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
271d0 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
271e0 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
271f0 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
27200 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
27210 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
27220 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
27230 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
27240 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
27250 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
27260 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
27270 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
27280 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
27290 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
272a0 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
272b0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
272c0 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
272d0 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
272e0 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
272f0 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
27300 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
27310 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
27320 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
27330 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
27340 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
27350 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
27360 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
27370 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
27380 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
27390 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
273a0 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
273b0 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
273c0 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
273d0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
273e0 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
273f0 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
27400 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
27410 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
27420 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
27430 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
27440 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
27450 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
27460 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
27470 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
27480 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
27490 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
274a0 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
274b0 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
274c0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
274d0 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
274e0 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
274f0 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
27500 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
27510 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
27520 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
27530 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
27540 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
27550 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
27560 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
27570 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
27580 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
27590 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
275a0 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
275b0 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
275c0 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
275d0 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
275e0 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
275f0 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
27600 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
27610 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
27620 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
27630 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
27640 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
27650 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
27660 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
27670 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
27680 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
27690 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
276a0 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
276b0 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
276c0 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
276d0 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
276e0 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
276f0 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
27700 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
27710 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
27720 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
27730 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
27740 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
27750 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
27760 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
27770 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
27780 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
27790 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
277a0 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
277b0 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
277c0 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
277d0 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
277e0 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
277f0 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
27800 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
27810 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
27820 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
27830 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
27840 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
27850 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66  or a resusable f
27860 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
27870 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
27880 0a 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a  .  if( 0==stat(z
27890 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b  Path, &sStat) ){
278a0 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  .    unixInodeIn
278b0 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20  fo *pInode;..   
278c0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
278d0 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  );.    pInode = 
278e0 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  inodeList;.    w
278f0 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
27900 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  (pInode->fileId.
27910 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65  dev!=sStat.st_de
27920 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v.              
27930 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65         || pInode
27940 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53  ->fileId.ino!=sS
27950 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20  tat.st_ino) ){. 
27960 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70        pInode = p
27970 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
27980 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f    }.    if( pIno
27990 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78  de ){.      Unix
279a0 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20  UnusedFd **pp;. 
279b0 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e       for(pp=&pIn
279c0 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70  ode->pUnused; *p
279d0 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67  p && (*pp)->flag
279e0 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28  s!=flags; pp=&((
279f0 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20  *pp)->pNext));. 
27a00 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a       pUnused = *
27a10 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55  pp;.      if( pU
27a20 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
27a30 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e   *pp = pUnused->
27a40 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
27a50 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
27a60 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
27a70 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21  endif    /* if !
27a80 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20  OS_VXWORKS */.  
27a90 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a  return pUnused;.
27aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
27ab0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
27ac0 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74   by unixOpen() t
27ad0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
27ae0 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73  unix permissions
27af0 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65  .** to create ne
27b00 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66  w files with. If
27b10 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
27b20 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
27b30 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
27b40 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74  and a value suit
27b50 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67  able for passing
27b60 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
27b70 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32  gument to open(2
27b80 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20  ) is.** written 
27b90 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e  to *pMode. If an
27ba0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
27bb0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
27bc0 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
27bd0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
27be0 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69  alue of *pMode i
27bf0 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a  s not modified..
27c00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
27c10 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69  e being opened i
27c20 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
27c30 6c 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73  le, it is always
27c40 20 63 72 65 61 74 65 64 20 77 69 74 68 0a 2a 2a   created with.**
27c50 20 74 68 65 20 6f 63 74 61 6c 20 70 65 72 6d 69   the octal permi
27c60 73 73 69 6f 6e 73 20 30 36 30 30 20 28 72 65 61  ssions 0600 (rea
27c70 64 2f 77 72 69 74 61 62 6c 65 20 62 79 20 6f 77  d/writable by ow
27c80 6e 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20 74 68  ner only). If th
27c90 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 20 64  e file.** is a d
27ca0 61 74 61 62 61 73 65 20 6f 72 20 6d 61 73 74 65  atabase or maste
27cb0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  r journal file, 
27cc0 69 74 20 69 73 20 63 72 65 61 74 65 64 20 77 69  it is created wi
27cd0 74 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  th the permissio
27ce0 6e 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c 49  ns .** mask SQLI
27cf0 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
27d00 50 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a 0a  PERMISSIONS..**.
27d10 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74  ** Finally, if t
27d20 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
27d30 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72  ened is a WAL or
27d40 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
27d50 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   file, then .** 
27d60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75  this function qu
27d70 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73  eries the file-s
27d80 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65  ystem for the pe
27d90 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
27da0 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
27db0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
27dc0 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65   and sets *pMode
27dd0 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20   to this value. 
27de0 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73  Whenever .** pos
27df0 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a  sible, WAL and j
27e00 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
27e10 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
27e20 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
27e30 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61  ons .** as the a
27e40 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
27e50 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
27e60 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  f the SQLITE_ENA
27e70 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70  BLE_8_3_NAMES op
27e80 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
27e90 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69   then the.** ori
27ea0 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
27eb0 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20  s unavailable.  
27ec0 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73  But 8_3_NAMES is
27ed0 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a   only used for.*
27ee0 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d  * FAT filesystem
27ef0 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e  s and permission
27f00 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20  s do not matter 
27f10 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75  there, so just u
27f20 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  se.** the defaul
27f30 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a  t permissions..*
27f40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
27f50 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
27f60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27f70 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
27f80 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69     /* Path of fi
27f90 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65  le (possibly) be
27fa0 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20  ing created */. 
27fb0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fd0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
27fe0 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74   as 4th argument
27ff0 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   to xOpen() */. 
28000 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 20 20   mode_t *pMode  
28010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28020 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73   /* OUT: Permiss
28030 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c  ions to open fil
28040 65 20 77 69 74 68 20 2a 2f 0a 29 7b 0a 20 20 69  e with */.){.  i
28050 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28060 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
28070 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
28080 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 53 51 4c 49  .  *pMode = SQLI
28090 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
280a0 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 69  PERMISSIONS;.  i
280b0 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
280c0 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
280d0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
280e0 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61  RNAL) ){.    cha
280f0 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41  r zDb[MAX_PATHNA
28100 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61  ME+1];     /* Da
28110 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68  tabase file path
28120 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b   */.    int nDb;
28130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28140 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28150 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69  of valid bytes i
28160 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72  n zDb */.    str
28170 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
28180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
28190 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f  tput of stat() o
281a0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
281b0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68  */..    /* zPath
281c0 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20   is a path to a 
281d0 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  WAL or journal f
281e0 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ile. The followi
281f0 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73  ng block derives
28200 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68  .    ** the path
28210 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
28220 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
28230 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69   from zPath. Thi
28240 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a  s block handles.
28250 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
28260 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76  wing naming conv
28270 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a  entions:.    **.
28280 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
28290 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a  to db>-journal".
282a0 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
282b0 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20  to db>-wal".    
282c0 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
282d0 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20  b>-journalNN".  
282e0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
282f0 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20   db>-walNN".    
28300 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20  **.    ** where 
28310 4e 4e 20 69 73 20 61 20 34 20 64 69 67 69 74 20  NN is a 4 digit 
28320 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20  decimal number. 
28330 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63  The NN naming sc
28340 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a  hemes are .    *
28350 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  * used by the te
28360 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d  st_multiplex.c m
28370 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  odule..    */.  
28380 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53    nDb = sqlite3S
28390 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d  trlen30(zPath) -
283a0 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28 20   1; .    while( 
283b0 6e 44 62 3e 30 20 26 26 20 7a 50 61 74 68 5b 6e  nDb>0 && zPath[n
283c0 44 62 5d 21 3d 27 2d 27 20 29 20 6e 44 62 2d 2d  Db]!='-' ) nDb--
283d0 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30  ;.    if( nDb==0
283e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
283f0 5f 4f 4b 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  _OK;.    memcpy(
28400 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29  zDb, zPath, nDb)
28410 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d  ;.    zDb[nDb] =
28420 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20   '\0';..    if( 
28430 30 3d 3d 73 74 61 74 28 7a 44 62 2c 20 26 73 53  0==stat(zDb, &sS
28440 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  tat) ){.      *p
28450 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f  Mode = sStat.st_
28460 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20  mode & 0777;.   
28470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
28480 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
28490 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
284a0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
284b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
284c0 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
284d0 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
284e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
284f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
28500 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
28510 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
28520 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
28530 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
28540 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
28550 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
28560 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
28570 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
28580 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
28590 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
285a0 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
285b0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
285c0 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
285d0 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
285e0 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
285f0 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
28600 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
28610 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
28620 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
28630 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
28640 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
28650 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
28660 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
28670 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
28680 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
28690 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
286a0 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
286b0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
286c0 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
286d0 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
286e0 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
286f0 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
28700 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
28710 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
28720 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
28730 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
28740 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
28750 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
28760 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
28770 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
28780 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
28790 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
287a0 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
287b0 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
287c0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
287d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
287e0 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
287f0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
28800 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
28810 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
28820 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
28830 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
28840 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
28850 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
28860 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
28870 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
28880 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
28890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
288a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
288b0 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
288c0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
288f0 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
28900 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
28910 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
28920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
28930 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
28940 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
28950 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
28960 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
28970 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
28980 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
28990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
289a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
289b0 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
289c0 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  ) */.  int dirfd
289d0 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
289e0 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
289f0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
28a00 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e  or */.  int open
28a10 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
28a20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
28a30 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28  to pass to open(
28a40 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  ) */.  int eType
28a50 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
28a60 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
28a70 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
28a80 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20  .  int noLock;  
28a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28aa0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
28ab0 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  t locking primit
28ac0 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ives */.  int rc
28ad0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
28ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
28af0 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
28b00 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63   */..  int isExc
28b10 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
28b20 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
28b30 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
28b40 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
28b50 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
28b60 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
28b70 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
28b80 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
28b90 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
28ba0 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
28bb0 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
28bc0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
28bd0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
28be0 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
28bf0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
28c00 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
28c10 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
28c20 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
28c30 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50  LE.  int isAutoP
28c40 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26  roxy  = (flags &
28c50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
28c60 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a  OPROXY);.#endif.
28c70 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
28c80 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
28c90 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
28ca0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
28cb0 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
28cc0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
28cd0 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
28ce0 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
28cf0 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
28d00 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
28d10 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
28d20 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
28d30 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
28d40 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
28d50 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69  /.  int isOpenDi
28d60 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65  rectory = (isCre
28d70 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
28d80 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
28d90 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
28da0 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
28db0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
28dc0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
28dd0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
28de0 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
28df0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
28e00 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
28e10 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
28e20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
28e30 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
28e40 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
28e50 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
28e60 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
28e70 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
28e80 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
28e90 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
28ea0 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+1];.  const c
28eb0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
28ec0 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
28ed0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
28ee0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
28ef0 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
28f00 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
28f10 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
28f20 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
28f30 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
28f40 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
28f50 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
28f60 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
28f70 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
28f80 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
28f90 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
28fa0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
28fb0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
28fc0 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
28fd0 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
28fe0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
28ff0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
29000 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
29010 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
29020 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
29030 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
29040 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
29050 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
29060 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
29070 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
29080 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
29090 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
290a0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
290b0 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
290c0 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
290d0 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
290e0 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
290f0 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
29100 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
29110 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
29120 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
29130 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
29140 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
29150 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
29160 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
29170 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
29180 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
29190 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
291a0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
291b0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
291c0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
291d0 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
291e0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
291f0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
29200 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
29210 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
29220 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
29230 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
29240 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
29250 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
29260 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
29270 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
29280 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
29290 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
292a0 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
292b0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
292c0 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
292d0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
292e0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
292f0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
29300 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
29310 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
29320 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
29330 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
29340 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
29350 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
29360 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
29370 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
29380 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
29390 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
293a0 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
293b0 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
293c0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
293d0 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  .  );..  memset(
293e0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  p, 0, sizeof(uni
293f0 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20  xFile));..  if( 
29400 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29410 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
29420 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
29430 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e  pUnused;.    pUn
29440 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
29450 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61  bleFd(zName, fla
29460 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  gs);.    if( pUn
29470 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64  used ){.      fd
29480 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
29490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
294a0 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
294b0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
294c0 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
294d0 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
294e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
294f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
29500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29510 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70    p->pUnused = p
29520 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20  Unused;.  }else 
29530 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
29540 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
29550 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72   NULL, the upper
29560 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73   layer is reques
29570 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65  ting a temp file
29580 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
29590 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f  isDelete && !isO
295a0 70 65 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  penDirectory);. 
295b0 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54     rc = unixGetT
295c0 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48  empname(MAX_PATH
295d0 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65  NAME+1, zTmpname
295e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
295f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
29610 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a   }.    zName = z
29620 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  Tmpname;.  }..  
29630 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
29640 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c   value of the fl
29650 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61  ags parameter pa
29660 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75  ssed to POSIX fu
29670 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e  nction.  ** open
29680 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62  (). These must b
29690 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65  e calculated eve
296a0 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e  n if open() is n
296b0 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20  ot called, as.  
296c0 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73  ** they may be s
296d0 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
296e0 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
296f0 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65   and used by the
29700 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69   .  ** 'conch fi
29710 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63  le' locking func
29720 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20  tions later on. 
29730 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64   */.  if( isRead
29740 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67  only )  openFlag
29750 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
29760 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
29770 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
29780 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73  O_RDWR;.  if( is
29790 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e  Create )    open
297a0 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54  Flags |= O_CREAT
297b0 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  ;.  if( isExclus
297c0 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ive ) openFlags 
297d0 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46  |= (O_EXCL|O_NOF
297e0 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c  OLLOW);.  openFl
297f0 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46  ags |= (O_LARGEF
29800 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a  ILE|O_BINARY);..
29810 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
29820 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64    mode_t openMod
29830 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29840 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  /* Permissions t
29850 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69  o create file wi
29860 74 68 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  th */.    rc = f
29870 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
29880 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  e(zName, flags, 
29890 26 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20  &openMode);.    
298a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
298b0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
298c0 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29  t( !p->pUnused )
298d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
298e0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
298f0 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d  EN_WAL || eType=
29900 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
29910 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20  N_JOURNAL );.   
29920 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29930 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62    }.    fd = rob
29940 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
29950 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
29960 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ode);.    OSTRAC
29970 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64  E(("OPENX   %-3d
29980 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20   %s 0%o\n", fd, 
29990 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
299a0 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  ));.    if( fd<0
299b0 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49   && errno!=EISDI
299c0 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65  R && isReadWrite
299d0 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
299e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   ){.      /* Fai
299f0 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  led to open the 
29a00 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72  file for read/wr
29a10 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20  ite access. Try 
29a20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  read-only. */.  
29a30 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53      flags &= ~(S
29a40 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
29a50 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
29a60 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20  _CREATE);.      
29a70 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f  openFlags &= ~(O
29a80 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a  _RDWR|O_CREAT);.
29a90 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
29aa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
29ab0 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46  NLY;.      openF
29ac0 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
29ad0 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e  ;.      isReadon
29ae0 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 64  ly = 1;.      fd
29af0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
29b00 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
29b10 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
29b20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  }.    if( fd<0 )
29b30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
29b40 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
29b50 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
29b60 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a  "open", zName);.
29b70 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
29b80 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
29b90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64    }.  assert( fd
29ba0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75  >=0 );.  if( pOu
29bb0 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
29bc0 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
29bd0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
29be0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70  pUnused ){.    p
29bf0 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20  ->pUnused->fd = 
29c00 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73  fd;.    p->pUnus
29c10 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  ed->flags = flag
29c20 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  s;.  }..  if( is
29c30 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53  Delete ){.#if OS
29c40 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61  _VXWORKS.    zPa
29c50 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73  th = zName;.#els
29c60 65 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61  e.    unlink(zNa
29c70 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  me);.#endif.  }.
29c80 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
29c90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
29ca0 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f    else{.    p->o
29cb0 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
29cc0 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  lags;.  }.#endif
29cd0 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69  ..  if( isOpenDi
29ce0 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 72  rectory ){.    r
29cf0 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  c = openDirector
29d00 79 28 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29  y(zPath, &dirfd)
29d10 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
29d20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29d30 20 2f 2a 20 49 74 20 69 73 20 73 61 66 65 20 74   /* It is safe t
29d40 6f 20 63 6c 6f 73 65 20 66 64 20 61 74 20 74 68  o close fd at th
29d50 69 73 20 70 6f 69 6e 74 2c 20 62 65 63 61 75 73  is point, becaus
29d60 65 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  e it is guarante
29d70 65 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  ed not.      ** 
29d80 74 6f 20 62 65 20 6f 70 65 6e 20 6f 6e 20 61 20  to be open on a 
29d90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
29da0 66 20 69 74 20 77 65 72 65 20 6f 70 65 6e 20 6f  f it were open o
29db0 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
29dc0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 77  e,.      ** it w
29dd0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65  ould not be safe
29de0 20 74 6f 20 63 6c 6f 73 65 20 61 73 20 74 68 69   to close as thi
29df0 73 20 77 6f 75 6c 64 20 72 65 6c 65 61 73 65 20  s would release 
29e00 61 6e 79 20 6c 6f 63 6b 73 20 68 65 6c 64 0a 20  any locks held. 
29e10 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66       ** on the f
29e20 69 6c 65 20 62 79 20 74 68 69 73 20 70 72 6f 63  ile by this proc
29e30 65 73 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61  ess.  */.      a
29e40 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51  ssert( eType!=SQ
29e50 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
29e60 42 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73  B );.      robus
29e70 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
29e80 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
29e90 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
29ea0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  ed;.    }.  }..#
29eb0 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
29ec0 0a 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46  .  osFcntl(fd, F
29ed0 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
29ee0 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
29ef0 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
29f00 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20  endif..  noLock 
29f10 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  = eType!=SQLITE_
29f20 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20  OPEN_MAIN_DB;.. 
29f30 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
29f40 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
29f50 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
29f60 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74  G_STYLE.  struct
29f70 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
29f80 20 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64    if( fstatfs(fd
29f90 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31  , &fsInfo) == -1
29fa0 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
29fb0 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74  le*)pFile)->last
29fc0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
29fd0 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20     if( dirfd>=0 
29fe0 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
29ff0 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , dirfd, __LINE_
2a000 5f 29 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  _);.    robust_c
2a010 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
2a020 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72  NE__);.    retur
2a030 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
2a040 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20  CCESS;.  }.  if 
2a050 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d  (0 == strncmp("m
2a060 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  sdos", fsInfo.f_
2a070 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
2a080 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
2a090 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
2a0a0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
2a0b0 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
2a0c0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20  }.#endif.  .#if 
2a0d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2a0e0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20  CKING_STYLE.#if 
2a0f0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2a100 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73  OXY_LOCKING.  is
2a110 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23  AutoProxy = 1;.#
2a120 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75  endif.  if( isAu
2a130 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74  toProxy && (zPat
2a140 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f  h!=NULL) && (!no
2a150 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78  Lock) && pVfs->x
2a160 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  Open ){.    char
2a170 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
2a180 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
2a190 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
2a1a0 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
2a1b0 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
2a1c0 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
2a1d0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
2a1e0 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
2a1f0 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d  s use proxy, 0 m
2a200 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76  eans .    ** nev
2a210 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
2a220 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
2a230 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
2a240 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f   files only.  */
2a250 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63  .    if( envforc
2a260 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e!=NULL ){.     
2a270 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69   useProxy = atoi
2a280 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20  (envforce)>0;.  
2a290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2a2a0 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
2a2b0 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nfo;.      if( s
2a2c0 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73  tatfs(zPath, &fs
2a2d0 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
2a2e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
2a2f0 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66  ory, the close(f
2a300 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f  d) call is sub-o
2a310 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66  ptimal. If the f
2a320 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20  ile opened.     
2a330 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73     ** with fd is
2a340 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2a350 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
2a360 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2a370 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
2a380 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  * on that file t
2a390 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
2a3a0 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f  y holding adviso
2a3b0 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a  ry locks on it,.
2a3c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2a3d0 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73  the call to clos
2a3e0 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20  e() will cancel 
2a3f0 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20  those locks. In 
2a400 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20  practice,.      
2a410 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d    ** we're assum
2a420 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28  ing that statfs(
2a430 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76  ) doesn't fail v
2a440 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65  ery often. At le
2a450 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ast.        ** n
2a460 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66  ot while other f
2a470 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2a480 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61  opened by the sa
2a490 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20  me process on.  
2a4a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d        ** the sam
2a4b0 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69  e file are worki
2a4c0 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ng.  */.        
2a4d0 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  p->lastErrno = e
2a4e0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66  rrno;.        if
2a4f0 28 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20  ( dirfd>=0 ){.  
2a500 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
2a510 6c 6f 73 65 28 70 2c 20 64 69 72 66 64 2c 20 5f  lose(p, dirfd, _
2a520 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2a530 20 20 7d 0a 20 20 20 20 20 20 20 20 72 6f 62 75    }.        robu
2a540 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
2a550 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2a560 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2a570 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
2a580 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
2a590 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d  inished;.      }
2a5a0 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
2a5b0 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  = !(fsInfo.f_fla
2a5c0 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20  gs&MNT_LOCAL);. 
2a5d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
2a5e0 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
2a5f0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
2a600 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72  le(pVfs, fd, dir
2a610 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
2a620 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  , noLock,.      
2a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a640 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20 69 73      isDelete, is
2a650 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 20  Readonly);.     
2a660 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a670 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2a680 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
2a690 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
2a6a0 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
2a6b0 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
2a6c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2a6e0 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
2a6f0 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
2a700 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
2a710 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
2a720 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
2a730 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
2a740 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
2a750 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
2a760 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
2a770 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
2a780 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
2a790 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
2a7a0 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
2a7b0 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
2a7c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
2a7d0 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
2a7e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2a7f0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2a800 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
2a810 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
2a820 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2a830 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
2a840 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
2a850 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65  fd, dirfd, pFile
2a860 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c  , zPath, noLock,
2a870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a880 20 20 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c         isDelete,
2a890 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 6f 70   isReadonly);.op
2a8a0 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69  en_finished:.  i
2a8b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a8c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2a8d0 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29  free(p->pUnused)
2a8e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a8f0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  c;.}.../*.** Del
2a900 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20  ete the file at 
2a910 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
2a920 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
2a930 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a  s true, fsync().
2a940 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
2a950 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
2a960 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
2a970 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
2a980 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
2a990 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  s *NotUsed,     
2a9a0 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  /* VFS containin
2a9b0 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44  g this as the xD
2a9c0 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  elete method */.
2a9d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2a9e0 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ath,        /* N
2a9f0 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
2aa00 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69  e deleted */.  i
2aa10 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20  nt dirSync      
2aa20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
2aa30 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72  rue, fsync() dir
2aa40 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
2aa50 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b  eting file */.){
2aa60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2aa70 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
2aa80 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2aa90 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
2aaa0 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
2aab0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
2aac0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28  );.  if( unlink(
2aad0 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 26 26 20  zPath)==(-1) && 
2aae0 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
2aaf0 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
2ab00 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2ab10 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
2ab20 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
2ab30 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
2ab40 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
2ab50 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63  NC.  if( dirSync
2ab60 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
2ab70 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72      rc = openDir
2ab80 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
2ab90 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2aba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
2abb0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
2abc0 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
2abd0 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
2abe0 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
2abf0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
2ac00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
2ac10 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2ac20 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
2ac30 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74  C, "fsync", zPat
2ac40 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
2ac50 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
2ac60 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2ac70 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2ac80 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
2ac90 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ../*.** Test the
2aca0 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72   existance of or
2acb0 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
2acc0 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74  ons of file zPat
2acd0 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70  h. The.** test p
2ace0 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73  erformed depends
2acf0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
2ad00 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
2ad10 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
2ad20 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31  EXISTS: Return 1
2ad30 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   if the file exi
2ad40 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  sts.**     SQLIT
2ad50 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
2ad60 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TE: Return 1 if 
2ad70 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
2ad80 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a   and writable..*
2ad90 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
2ada0 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65  ESS_READONLY: Re
2adb0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
2adc0 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a  le is readable..
2add0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  **.** Otherwise 
2ade0 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
2adf0 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65  tic int unixAcce
2ae00 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
2ae10 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a  s *NotUsed,   /*
2ae20 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e   The VFS contain
2ae30 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73  ing this xAccess
2ae40 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
2ae50 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2ae60 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
2ae70 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  the file to exam
2ae80 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ine */.  int fla
2ae90 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2aea0 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77   /* What do we w
2aeb0 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f  ant to learn abo
2aec0 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c  ut the zPath fil
2aed0 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  e? */.  int *pRe
2aee0 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
2aef0 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20  /* Write result 
2af00 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a  boolean here */.
2af10 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d  ){.  int amode =
2af20 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
2af30 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2af40 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2af50 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2af60 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
2af70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
2af80 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
2af90 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2afa0 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  STS:.      amode
2afb0 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = F_OK;.      b
2afc0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2afd0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
2afe0 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d  DWRITE:.      am
2aff0 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b  ode = W_OK|R_OK;
2b000 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2b010 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
2b020 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20  CESS_READ:.     
2b030 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20   amode = R_OK;. 
2b040 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2b050 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
2b060 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
2b070 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
2b080 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
2b090 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28 7a 50  t = (osAccess(zP
2b0a0 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b  ath, amode)==0);
2b0b0 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51  .  if( flags==SQ
2b0c0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2b0d0 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74 20 29  TS && *pResOut )
2b0e0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
2b0f0 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20 30  t buf;.    if( 0
2b100 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c 20 26 62  ==stat(zPath, &b
2b110 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69  uf) && buf.st_si
2b120 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ze==0 ){.      *
2b130 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20  pResOut = 0;.   
2b140 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2b150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
2b160 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
2b170 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
2b180 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
2b190 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65  me. The relative
2b1a0 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72   path.** is stor
2b1b0 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d  ed as a nul-term
2b1c0 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e  inated string in
2b1d0 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
2b1e0 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61  ted to by.** zPa
2b1f0 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20  th. .**.** zOut 
2b200 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
2b210 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73  er of at least s
2b220 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
2b230 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20  hname bytes .** 
2b240 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d  (in this case, M
2b250 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65  AX_PATHNAME byte
2b260 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74  s). The full-pat
2b270 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  h is written to.
2b280 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62  ** this buffer b
2b290 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2b2a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2b2b0 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  nixFullPathname(
2b2c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2b2d0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
2b2e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
2b2f0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
2b300 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2b310 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2b320 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
2b330 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
2b340 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20    int nOut,     
2b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b360 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
2b370 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
2b380 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75  s */.  char *zOu
2b390 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2b3a0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
2b3b0 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f  uffer */.){..  /
2b3c0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
2b3d0 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
2b3e0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
2b3f0 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
2b400 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
2b410 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
2b420 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
2b430 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
2b440 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
2b450 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
2b460 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
2b470 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
2b480 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
2b490 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
2b4a0 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
2b4b0 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
2b4c0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
2b4d0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2b4e0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a  QLITE_ERROR );..
2b4f0 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e    assert( pVfs->
2b500 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f  mxPathname==MAX_
2b510 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e  PATHNAME );.  UN
2b520 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2b530 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f  Vfs);..  zOut[nO
2b540 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut-1] = '\0';.  
2b550 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f  if( zPath[0]=='/
2b560 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
2b570 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20  _snprintf(nOut, 
2b580 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74  zOut, "%s", zPat
2b590 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
2b5a0 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69   int nCwd;.    i
2b5b0 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74  f( osGetcwd(zOut
2b5c0 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
2b5d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
2b5e0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
2b5f0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
2b600 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29  "getcwd", zPath)
2b610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64  ;.    }.    nCwd
2b620 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
2b630 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
2b640 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
2b650 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64  nCwd, &zOut[nCwd
2b660 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29  ], "/%s", zPath)
2b670 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
2b680 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
2b690 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b6a0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
2b6b0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
2b6c0 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
2b6d0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
2b6e0 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
2b6f0 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
2b700 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
2b710 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
2b720 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
2b730 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  y..*/.#include <
2b740 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20  dlfcn.h>.static 
2b750 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e  void *unixDlOpen
2b760 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2b770 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61  tUsed, const cha
2b780 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
2b790 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b7a0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
2b7b0 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
2b7c0 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
2b7d0 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
2b7e0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  }../*.** SQLite 
2b7f0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
2b800 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ion immediately 
2b810 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
2b820 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a  unixDlSym() or.*
2b830 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66  * unixDlOpen() f
2b840 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20  ails (returns a 
2b850 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49  null pointer). I
2b860 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65  f a more detaile
2b870 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  d error.** messa
2b880 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ge is available,
2b890 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
2b8a0 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f  o zBufOut. If no
2b8b0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
2b8c0 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  * is available, 
2b8d0 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20  zBufOut is left 
2b8e0 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53  unmodified and S
2b8f0 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66  QLite uses a def
2b900 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  ault.** error me
2b910 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssage..*/.static
2b920 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f   void unixDlErro
2b930 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  r(sqlite3_vfs *N
2b940 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
2b950 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
2b960 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2b970 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50  zErr;.  UNUSED_P
2b980 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2b990 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
2b9a0 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20  tex();.  zErr = 
2b9b0 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  dlerror();.  if(
2b9c0 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c   zErr ){.    sql
2b9d0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
2b9e0 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73  uf, zBufOut, "%s
2b9f0 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  ", zErr);.  }.  
2ba00 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2ba10 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2ba20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69  (*unixDlSym(sqli
2ba30 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2ba40 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74  , void *p, const
2ba50 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69   char*zSym))(voi
2ba60 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47  d){.  /* .  ** G
2ba70 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  CC with -pedanti
2ba80 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68  c-errors says th
2ba90 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20  at C90 does not 
2baa0 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f  allow a void* to
2bab0 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e   be.  ** cast in
2bac0 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
2bad0 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64  a function.  And
2bae0 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79   yet the library
2baf0 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65   dlsym() routine
2bb00 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
2bb10 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72  void* which is r
2bb20 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
2bb30 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
2bb40 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a  So how do we.  *
2bb50 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69  * use dlsym() wi
2bb60 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
2bb70 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ors?.  **.  ** V
2bb80 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20  ariable x below 
2bb90 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
2bba0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2bbb0 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a  function taking.
2bbc0 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20    ** parameters 
2bbd0 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20  void* and const 
2bbe0 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e  char* and return
2bbf0 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
2bc00 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a   a function..  *
2bc10 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20  * We initialize 
2bc20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69  x by assigning i
2bc30 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
2bc40 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74  he dlsym() funct
2bc50 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20  ion..  ** (That 
2bc60 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69  assignment requi
2bc70 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68  res a cast.)  Th
2bc80 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66  en we call the f
2bc90 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a  unction that.  *
2bca0 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  * x points to.  
2bcb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
2bcc0 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75  work-around is u
2bcd0 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20  nlikely to work 
2bce0 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79  correctly on any
2bcf0 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20   system where.  
2bd00 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61  ** you really ca
2bd10 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63  nnot cast a func
2bd20 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74  tion pointer int
2bd30 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68  o void*.  But th
2bd40 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  en, on the.  ** 
2bd50 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79  other hand, dlsy
2bd60 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  m() will not wor
2bd70 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74  k on such a syst
2bd80 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65  em either, so we
2bd90 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72   have.  ** not r
2bda0 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68  eally lost anyth
2bdb0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64  ing..  */.  void
2bdc0 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f   (*(*x)(void*,co
2bdd0 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
2bde0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2bdf0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2be00 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29    x = (void(*(*)
2be10 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
2be20 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d  r*))(void))dlsym
2be30 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28  ;.  return (*x)(
2be40 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74  p, zSym);.}.stat
2be50 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c  ic void unixDlCl
2be60 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
2be70 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
2be80 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
2be90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2bea0 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65  Used);.  dlclose
2beb0 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  (pHandle);.}.#el
2bec0 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
2bed0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
2bee0 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
2bef0 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69  */.  #define uni
2bf00 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  xDlOpen  0.  #de
2bf10 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72  fine unixDlError
2bf20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
2bf30 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  xDlSym   0.  #de
2bf40 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65  fine unixDlClose
2bf50 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
2bf60 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   Write nBuf byte
2bf70 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61  s of random data
2bf80 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
2bf90 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
2bfa0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2bfb0 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
2bfc0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2bfd0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
2bfe0 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
2bff0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2c000 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73  ed);.  assert((s
2c010 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a  ize_t)nBuf>=(siz
2c020 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65  eof(time_t)+size
2c030 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a  of(int)));..  /*
2c040 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
2c050 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
2c060 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
2c070 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
2c080 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
2c090 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
2c0a0 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
2c0b0 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
2c0c0 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
2c0d0 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
2c0e0 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
2c0f0 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
2c100 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
2c110 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
2c120 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
2c130 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
2c140 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
2c150 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
2c160 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
2c170 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
2c180 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
2c190 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
2c1a0 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
2c1b0 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
2c1c0 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
2c1d0 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
2c1e0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
2c1f0 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
2c200 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
2c210 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
2c220 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
2c230 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
2c240 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
2c250 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
2c260 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
2c270 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
2c280 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .  This makes th
2c290 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
2c2a0 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
2c2b0 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
2c2c0 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69  nBuf);.#if !defi
2c2d0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
2c2e0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  .  {.    int pid
2c2f0 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 72  , fd;.    fd = r
2c300 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76  obust_open("/dev
2c310 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
2c320 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
2c330 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
2c340 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
2c350 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
2c360 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
2c370 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
2c380 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29    pid = getpid()
2c390 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
2c3a0 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  zBuf[sizeof(t)],
2c3b0 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
2c3c0 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
2c3d0 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a  t( sizeof(t)+siz
2c3e0 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f  eof(pid)<=(size_
2c3f0 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  t)nBuf );.      
2c400 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29  nBuf = sizeof(t)
2c410 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a   + sizeof(pid);.
2c420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c430 20 64 6f 7b 20 6e 42 75 66 20 3d 20 6f 73 52 65   do{ nBuf = osRe
2c440 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
2c450 66 29 3b 20 7d 77 68 69 6c 65 28 20 6e 42 75 66  f); }while( nBuf
2c460 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
2c470 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  TR );.      robu
2c480 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
2c490 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
2c4a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2c4b0 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f  turn nBuf;.}.../
2c4c0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
2c4d0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
2c4e0 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
2c4f0 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
2c500 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
2c510 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2c520 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
2c530 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
2c540 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
2c550 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
2c560 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
2c570 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
2c580 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
2c590 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
2c5a0 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
2c5b0 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
2c5c0 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
2c5d0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
2c5e0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
2c5f0 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
2c600 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
2c610 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
2c620 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
2c630 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
2c640 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d   *NotUsed, int m
2c650 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69  icroseconds){.#i
2c660 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
2c670 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
2c680 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20  p;..  sp.tv_sec 
2c690 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f  = microseconds /
2c6a0 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74   1000000;.  sp.t
2c6b0 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73  v_nsec = (micros
2c6c0 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30  econds % 1000000
2c6d0 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f  ) * 1000;.  nano
2c6e0 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29  sleep(&sp, NULL)
2c6f0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2c700 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2c710 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
2c720 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69  onds;.#elif defi
2c730 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
2c740 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
2c750 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65    usleep(microse
2c760 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
2c770 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2c780 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
2c790 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
2c7a0 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
2c7b0 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
2c7c0 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
2c7d0 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
2c7e0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2c7f0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2c800 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73    return seconds
2c810 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66  *1000000;.#endif
2c820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
2c830 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
2c840 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
2c850 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
2c860 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
2c870 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
2c880 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
2c890 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
2c8a0 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
2c8b0 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
2c8c0 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
2c8d0 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
2c8e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2c8f0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
2c900 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
2c910 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
2c920 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
2c930 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
2c940 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
2c950 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
2c960 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
2c970 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
2c980 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
2c990 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
2c9a0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
2c9b0 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
2c9c0 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
2c9d0 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
2c9e0 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
2c9f0 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
2ca00 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
2ca10 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
2ca20 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
2ca30 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
2ca40 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
2ca50 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
2ca60 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
2ca70 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
2ca80 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
2ca90 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
2caa0 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
2cab0 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
2cac0 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2cad0 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
2cae0 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2caf0 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
2cb00 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
2cb10 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2cb20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
2cb30 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20  iNow){.  static 
2cb40 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
2cb50 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
2cb60 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
2cb70 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
2cb80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
2cb90 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74  GETTOD).  time_t
2cba0 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
2cbb0 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c    *piNow = ((sql
2cbc0 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30  ite3_int64)t)*10
2cbd0 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  00 + unixEpoch;.
2cbe0 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  #elif OS_VXWORKS
2cbf0 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
2cc00 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b  ec sNow;.  clock
2cc10 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52  _gettime(CLOCK_R
2cc20 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b  EALTIME, &sNow);
2cc30 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78  .  *piNow = unix
2cc40 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71  Epoch + 1000*(sq
2cc50 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77  lite3_int64)sNow
2cc60 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74  .tv_sec + sNow.t
2cc70 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a  v_nsec/1000000;.
2cc80 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74  #else.  struct t
2cc90 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67  imeval sNow;.  g
2cca0 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f  ettimeofday(&sNo
2ccb0 77 2c 20 30 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  w, 0);.  *piNow 
2ccc0 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
2ccd0 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
2cce0 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
2ccf0 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30  sNow.tv_usec/100
2cd00 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  0;.#endif..#ifde
2cd10 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2cd20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
2cd30 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
2cd40 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
2cd50 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
2cd60 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2cd70 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
2cd80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
2cd90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2cda0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
2cdb0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
2cdc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2cdd0 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
2cde0 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
2cdf0 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
2ce00 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
2ce10 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
2ce20 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
2ce30 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
2ce40 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
2ce50 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
2ce60 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
2ce70 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
2ce80 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
2ce90 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
2cea0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64  _vfs *NotUsed, d
2ceb0 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
2cec0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
2ced0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2cee0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2cef0 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
2cf00 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20  Int64(0, &i);.  
2cf10 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
2cf20 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20  000.0;.  return 
2cf30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61  0;.}../*.** We a
2cf40 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61 73  dded the xGetLas
2cf50 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20  tError() method 
2cf60 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69  with the intenti
2cf70 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a  on of providing.
2cf80 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65  ** better low-le
2cf90 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67  vel error messag
2cfa0 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e  es when operatin
2cfb0 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d  g-system problem
2cfc0 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72  s come up.** dur
2cfd0 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61  ing SQLite opera
2cfe0 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61  tion.  But so fa
2cff0 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20  r, none of that 
2d000 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65  has been impleme
2d010 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  nted.** in the c
2d020 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f  ore.  So this ro
2d030 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
2d040 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c  alled.  For now,
2d050 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a   it is merely.**
2d060 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e   a place-holder.
2d070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2d080 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  nixGetLastError(
2d090 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2d0a0 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
2d0b0 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65  d2, char *NotUse
2d0c0 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d3){.  UNUSED_PA
2d0d0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2d0e0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2d0f0 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a  ETER(NotUsed2);.
2d100 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d110 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20  ER(NotUsed3);.  
2d120 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
2d130 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2d140 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
2d150 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
2d160 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
2d170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d180 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2d190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2d1d0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2d1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d220 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2d230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
2d240 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67  in Proxy Locking
2d250 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2d260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d270 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  *.**.** Proxy lo
2d280 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72  cking is a "uber
2d290 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22  -locking-method"
2d2a0 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20   in this sense: 
2d2b0 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20   It uses the.** 
2d2c0 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65  other locking me
2d2d0 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61  thods on seconda
2d2e0 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20  ry lock files.  
2d2f0 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
2d300 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72   a.** meta-layer
2d310 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65   over top of the
2d320 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
2d330 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ng implemented a
2d340 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  bove.  For.** th
2d350 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
2d360 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
2d370 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79  lements of proxy
2d380 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65   locking is defe
2d390 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61  rred.** until la
2d3a0 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28  te in the file (
2d3b0 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20  here) after all 
2d3c0 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f  of the other I/O
2d3d0 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a   methods have.**
2d3e0 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20   been defined - 
2d3f0 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d  so that the prim
2d400 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  itive locking me
2d410 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61  thods are availa
2d420 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63  ble.** as servic
2d430 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20  es to help with 
2d440 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
2d450 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  on of proxy lock
2d460 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a  ing..**.****.**.
2d470 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c  ** The default l
2d480 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69  ocking schemes i
2d490 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74  n SQLite use byt
2d4a0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e  e-range locks on
2d4b0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2d4c0 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e   file to coordin
2d4d0 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72  ate safe, concur
2d4e0 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d  rent access by m
2d4f0 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a  ultiple readers.
2d500 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b  ** and writers [
2d510 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
2d520 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c  g/lockingv3.html
2d530 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c  ].  The five fil
2d540 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61  e locking.** sta
2d550 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50  tes (UNLOCKED, P
2d560 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20  ENDING, SHARED, 
2d570 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53  RESERVED, EXCLUS
2d580 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  IVE) are impleme
2d590 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58  nted.** as POSIX
2d5a0 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f   read & write lo
2d5b0 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73  cks over fixed s
2d5c0 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20  et of locations 
2d5d0 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20  (via fsctl),.** 
2d5e0 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f  on AFP and SMB o
2d5f0 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79  nly exclusive by
2d600 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
2d610 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61  re available via
2d620 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f   fsctl.** with _
2d630 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
2d640 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
2d650 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20  ckPB2) to track 
2d660 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65  the same 5 state
2d670 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74  s..** To simulat
2d680 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74  e a F_RDLCK on t
2d690 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c  he shared range,
2d6a0 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d   on AFP a random
2d6b0 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  ly selected.** a
2d6c0 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68  ddress in the sh
2d6d0 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
2d6e0 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44  ken for a SHARED
2d6f0 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72   lock, the entir
2d700 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67  e.** shared rang
2d710 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
2d720 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2d730 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45  ):.**.**      PE
2d740 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20  NDING_BYTE      
2d750 20 20 30 78 34 30 30 30 30 30 30 30 09 09 20 20    0x40000000..  
2d760 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52   ..**      RESER
2d770 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30  VED_BYTE       0
2d780 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20  x40000001.**    
2d790 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20    SHARED_RANGE  
2d7a0 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32        0x40000002
2d7b0 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a   -> 0x40000200.*
2d7c0 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
2d7d0 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  well on the loca
2d7e0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62  l file system, b
2d7f0 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c  ut shows a nearl
2d800 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f  y 100x.** slowdo
2d810 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f  wn in read perfo
2d820 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65  rmance on AFP be
2d830 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c  cause the AFP cl
2d840 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a  ient disables.**
2d850 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20   the read cache 
2d860 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20  when byte-range 
2d870 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e  locks are presen
2d880 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65  t.  Enabling the
2d890 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65   read.** cache e
2d8a0 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63  xposes a cache c
2d8b0 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d  oherency problem
2d8c0 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
2d8d0 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20   on all OS X.** 
2d8e0 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72  supported networ
2d8f0 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20  k file systems. 
2d900 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74   NFS and AFP bot
2d910 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a  h observe the.**
2d920 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73   close-to-open s
2d930 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73  emantics for ens
2d940 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65  uring cache cohe
2d950 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f  rency.** [http:/
2d960 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65  /nfs.sourceforge
2d970 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77  .net/#faq_a8], w
2d980 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66  hich does not ef
2d990 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64  fectively.** add
2d9a0 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65  ress the require
2d9b0 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72  ments for concur
2d9c0 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63  rent database ac
2d9d0 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
2d9e0 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20  .** readers and 
2d9f0 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70  writers.** [http
2da00 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f  ://www.nabble.co
2da10 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d  m/SQLite-on-NFS-
2da20 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d  cache-coherency-
2da30 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d  td15655701.html]
2da40 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65  ..**.** To addre
2da50 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ss the performan
2da60 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68  ce and cache coh
2da70 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70  erency issues, p
2da80 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
2da90 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65  g.** changes the
2daa0 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63   way database ac
2dab0 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c  cess is controll
2dac0 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61  ed by limiting a
2dad0 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69  ccess to a.** si
2dae0 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74  ngle host at a t
2daf0 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66  ime and moving f
2db00 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66  ile locks off of
2db10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2db20 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61  le.** and onto a
2db30 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74   proxy file on t
2db40 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
2db50 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a  stem.  .**.**.**
2db60 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63   Using proxy loc
2db70 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
2db80 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20  -------.**.** C 
2db90 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  APIs.**.**  sqli
2dba0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2dbb0 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
2dbc0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
2dbd0 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
2dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbf0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22  <proxy_path> | "
2dc00 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71  :auto:");.**  sq
2dc10 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
2dc20 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
2dc30 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
2dc40 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79  OXYFILE, &<proxy
2dc50 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a  _path>);.**.**.*
2dc60 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a  * SQL pragmas.**
2dc70 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
2dc80 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
2dc90 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61  y_file=<proxy_pa
2dca0 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20  th> | :auto:.** 
2dcb0 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
2dcc0 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
2dcd0 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79  le.**.** Specify
2dce0 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61  ing ":auto:" mea
2dcf0 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65  ns that if there
2dd00 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65   is a conch file
2dd10 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67   with a matching
2dd20 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69  .** host ID in i
2dd30 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74  t, the proxy pat
2dd40 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
2dd50 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
2dd60 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61  , otherwise.** a
2dd70 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65   proxy path base
2dd80 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20  d on the user's 
2dd90 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61  temp dir.** (via
2dda0 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52   confstr(_CS_DAR
2ddb0 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
2ddc0 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20  R,...)) will be 
2ddd0 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
2dde0 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c  actual proxy fil
2ddf0 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61  e name is genera
2de00 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d  ted from the nam
2de10 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68  e and path of th
2de20 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
2de30 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
2de40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f  :.**.**       Fo
2de50 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20  r database path 
2de60 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64  "/Users/me/foo.d
2de70 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65  b" .**       The
2de80 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
2de90 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c  be "<tmpdir>/sql
2dea0 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73  iteplocks/_Users
2deb0 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a  _me_foo.db:auto:
2dec0 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20  ").**.** Once a 
2ded0 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f  lock proxy is co
2dee0 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64  nfigured for a d
2def0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2df00 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a  on, it can not.*
2df10 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f  * be removed, ho
2df20 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20  wever it may be 
2df30 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69  switched to a di
2df40 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61  fferent proxy pa
2df50 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62  th via.** the ab
2df60 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69  ove APIs (assumi
2df70 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  ng the conch fil
2df80 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68  e is not being h
2df90 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a  eld by another.*
2dfa0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20  * connection or 
2dfb0 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a  process). .**.**
2dfc0 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f  .** How proxy lo
2dfd0 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d  cking works.** -
2dfe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dff0 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f  ------.**.** Pro
2e000 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  xy file locking 
2e010 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79  relies primarily
2e020 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70   on two new supp
2e030 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a  orting files: .*
2e040 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20  *.**   *  conch 
2e050 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63  file to limit ac
2e060 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
2e070 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73  base file to a s
2e080 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20  ingle host.**   
2e090 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a     at a time.**.
2e0a0 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69  **   *  proxy fi
2e0b0 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70  le to act as a p
2e0c0 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76  roxy for the adv
2e0d0 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d  isory locks norm
2e0e0 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b  ally.**      tak
2e0f0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
2e100 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  se.**.** The con
2e110 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65  ch file - to use
2e120 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73   a proxy file, s
2e130 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74  qlite must first
2e140 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68   "hold the conch
2e150 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61  ".** by taking a
2e160 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73  n sqlite-style s
2e170 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
2e180 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65  e conch file, re
2e190 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  ading the.** con
2e1a0 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72  tents and compar
2e1b0 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75  ing the host's u
2e1c0 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73  nique host ID (s
2e1d0 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f  ee below) and lo
2e1e0 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68  ck.** proxy path
2e1f0 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c   against the val
2e200 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
2e210 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f  e conch.  The co
2e220 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73  nch file is.** s
2e230 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d  tored in the sam
2e240 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74  e directory as t
2e250 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e260 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61   and the file na
2e270 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e  me.** is pattern
2e280 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74  ed after the dat
2e290 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2e2a0 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61  as ".<databasena
2e2b0 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49  me>-conch"..** I
2e2c0 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
2e2d0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2e2e0 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74   or it's content
2e2f0 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  s do not match t
2e300 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e  he.** host ID an
2e310 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c  d/or proxy path,
2e320 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69   then the lock i
2e330 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61  s escalated to a
2e340 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c  n exclusive.** l
2e350 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63  ock and the conc
2e360 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20  h file contents 
2e370 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20  is updated with 
2e380 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
2e390 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e  proxy.** path an
2e3a0 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f  d the lock is do
2e3b0 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68  wngraded to a sh
2e3c0 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e  ared lock again.
2e3d0 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a    If the conch.*
2e3e0 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f  * is held by ano
2e3f0 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69  ther process (wi
2e400 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  th a shared lock
2e410 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ), the exclusive
2e420 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61   lock.** will fa
2e430 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55  il and SQLITE_BU
2e440 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
2e450 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  **.** The proxy 
2e460 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d  file - a single-
2e470 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66  byte file used f
2e480 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20  or all advisory 
2e490 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f  file locks.** no
2e4a0 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20  rmally taken on 
2e4b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e4c0 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  e.   This allows
2e4d0 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e   for safe sharin
2e4e0 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  g.** of the data
2e4f0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75  base file for mu
2e500 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61  ltiple readers a
2e510 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68  nd writers on th
2e520 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28  e same.** host (
2e530 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65  the conch ensure
2e540 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20  s that they all 
2e550 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63  use the same loc
2e560 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a  al lock file)..*
2e570 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20  *.** Requesting 
2e580 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64  the lock proxy d
2e590 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74  oes not immediat
2e5a0 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e  ely take the con
2e5b0 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c  ch, it is.** onl
2e5c0 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  y taken when the
2e5d0 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20 74   first request t
2e5e0 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20  o lock database 
2e5f0 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a  file is made.  .
2e600 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  ** This matches 
2e610 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66  the semantics of
2e620 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c   the traditional
2e630 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   locking behavio
2e640 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e  r, where.** open
2e650 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ing a connection
2e660 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
2e670 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b  ile does not tak
2e680 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a  e a lock on it..
2e690 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f  ** The shared lo
2e6a0 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66  ck and an open f
2e6b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
2e6c0 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e  re maintained un
2e6d0 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e  til .** the conn
2e6e0 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61  ection to the da
2e6f0 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64  tabase is closed
2e700 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  . .**.** The pro
2e710 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  xy file and the 
2e720 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65  lock file are ne
2e730 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74  ver deleted so t
2e740 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a  hey only need.**
2e750 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 74   to be created t
2e760 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
2e770 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a  ey are used..**.
2e780 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
2e790 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d   options.** ----
2e7a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e7b0 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  -.**.**  SQLITE_
2e7c0 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2e7d0 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  KING.**.**      
2e7e0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   Database files 
2e7f0 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d  accessed on non-
2e800 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
2e810 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  ms are.**       
2e820 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
2e830 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f  nfigured for pro
2e840 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b  xy locking, lock
2e850 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20   files are.**   
2e860 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61      named automa
2e870 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68  tically using th
2e880 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a  e same logic as.
2e890 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  **       PRAGMA 
2e8a0 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
2e8b0 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a  ":auto:".**    .
2e8c0 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  **  SQLITE_PROXY
2e8d0 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20  _DEBUG.**.**    
2e8e0 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c     Enables the l
2e8f0 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20  ogging of error 
2e900 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 20  messages during 
2e910 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20  host id file.** 
2e920 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c 20        retrieval 
2e930 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a  and creation.**.
2e940 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  **  LOCKPROXYDIR
2e950 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65  .**.**       Ove
2e960 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75  rrides the defau
2e970 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65  lt directory use
2e980 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79  d for lock proxy
2e990 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20   files that.**  
2e9a0 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61       are named a
2e9b0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61  utomatically via
2e9c0 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65   the ":auto:" se
2e9d0 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  tting.**.**  SQL
2e9e0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
2e9f0 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
2ea00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72  .**.**       Per
2ea10 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20  missions to use 
2ea20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
2ea30 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74  directory for st
2ea40 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  oring the.**    
2ea50 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69     lock proxy fi
2ea60 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77  les, only used w
2ea70 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  hen LOCKPROXYDIR
2ea80 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20   is not set..** 
2ea90 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73     .**    .** As
2eaa0 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65   mentioned above
2eab0 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20  , when compiled 
2eac0 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46  with SQLITE_PREF
2ead0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2eae0 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65  ,.** setting the
2eaf0 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
2eb00 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52  iable SQLITE_FOR
2eb10 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
2eb20 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f   to 1 will.** fo
2eb30 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  rce proxy lockin
2eb40 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  g to be used for
2eb50 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
2eb60 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64  file opened, and
2eb70 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65   0.** will force
2eb80 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79   automatic proxy
2eb90 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64   locking to be d
2eba0 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20  isabled for all 
2ebb0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
2ebc0 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c  s (explicity cal
2ebd0 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f  ling the SQLITE_
2ebe0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
2ebf0 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73  E pragma or.** s
2ec00 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72  qlite_file_contr
2ec10 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66  ol API is not af
2ec20 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45  fected by SQLITE
2ec30 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2ec40 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  KING)..*/../*.**
2ec50 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
2ec60 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
2ec70 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23   on MacOSX .*/.#
2ec80 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2ec90 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2eca0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2ecb0 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TYLE../*.** The 
2ecc0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2ecd0 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68  ext has the path
2ece0 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74   and file struct
2ecf0 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d  ures for the rem
2ed00 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61  ote .** and loca
2ed10 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e  l proxy files in
2ed20 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73   it.*/.typedef s
2ed30 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
2ed40 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c  ngContext proxyL
2ed50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73  ockingContext;.s
2ed60 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
2ed70 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e  ngContext {.  un
2ed80 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
2ed90 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  e;         /* Op
2eda0 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  en conch file */
2edb0 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69  .  char *conchFi
2edc0 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  lePath;         
2edd0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
2ede0 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75  onch file */.  u
2edf0 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
2ee00 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  xy;         /* O
2ee10 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  pen proxy lock f
2ee20 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ile */.  char *l
2ee30 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20  ockProxyPath;   
2ee40 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2ee50 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
2ee60 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2ee70 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
2ee80 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2ee90 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
2eea0 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65  */.  int conchHe
2eeb0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2eec0 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f    /* 1 if the co
2eed0 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20  nch is held, -1 
2eee0 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  if lockless */. 
2eef0 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e   void *oldLockin
2ef00 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
2ef10 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e   Original lockin
2ef20 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74  gcontext to rest
2ef30 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a  ore on close */.
2ef40 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
2ef50 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64  hods const *pOld
2ef60 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f  Method;     /* O
2ef70 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68  riginal I/O meth
2ef80 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f  ods for close */
2ef90 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  .};../* .** The 
2efa0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
2efb0 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74  path for the dat
2efc0 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20  abase at dbPath 
2efd0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2efe0 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68  lPath, .** which
2eff0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76   must point to v
2f000 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d  alid, writable m
2f010 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75  emory large enou
2f020 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20  gh for a maxLen 
2f030 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70  length.** file p
2f040 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ath. .*/.static 
2f050 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b  int proxyGetLock
2f060 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  Path(const char 
2f070 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c  *dbPath, char *l
2f080 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78  Path, size_t max
2f090 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b  Len){.  int len;
2f0a0 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20  .  int dbLen;.  
2f0b0 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c  int i;..#ifdef L
2f0c0 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65  OCKPROXYDIR.  le
2f0d0 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
2f0e0 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c  h, LOCKPROXYDIR,
2f0f0 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a   maxLen);.#else.
2f100 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57  # ifdef _CS_DARW
2f110 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
2f120 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f  .  {.    if( !co
2f130 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
2f140 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20  _USER_TEMP_DIR, 
2f150 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29  lPath, maxLen) )
2f160 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
2f170 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66  ("GETLOCKPATH  f
2f180 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25  ailed %s errno=%
2f190 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  d pid=%d\n",.   
2f1a0 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74              lPat
2f1b0 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64  h, errno, getpid
2f1c0 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ()));.      retu
2f1d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2f1e0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LOCK;.    }.    
2f1f0 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50  len = strlcat(lP
2f200 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63  ath, "sqliteploc
2f210 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20  ks", maxLen);   
2f220 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c   .  }.# else.  l
2f230 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
2f240 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78  th, "/tmp/", max
2f250 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65  Len);.# endif.#e
2f260 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74  ndif..  if( lPat
2f270 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b  h[len-1]!='/' ){
2f280 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
2f290 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d  at(lPath, "/", m
2f2a0 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20  axLen);.  }.  . 
2f2b0 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68   /* transform th
2f2c0 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75  e db path to a u
2f2d0 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65  nique cache name
2f2e0 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69   */.  dbLen = (i
2f2f0 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68  nt)strlen(dbPath
2f300 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69  );.  for( i=0; i
2f310 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e  <dbLen && (i+len
2f320 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b  +7)<(int)maxLen;
2f330 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
2f340 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20  c = dbPath[i];. 
2f350 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20     lPath[i+len] 
2f360 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63  = (c=='/')?'_':c
2f370 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b  ;.  }.  lPath[i+
2f380 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72  len]='\0';.  str
2f390 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75  lcat(lPath, ":au
2f3a0 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20  to:", maxLen);. 
2f3b0 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f   OSTRACE(("GETLO
2f3c0 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f  CKPATH  proxy lo
2f3d0 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
2f3e0 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74  d\n", lPath, get
2f3f0 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72  pid()));.  retur
2f400 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2f410 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20  /* . ** Creates 
2f420 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e  the lock file an
2f430 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69  d any missing di
2f440 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63  rectories in loc
2f450 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63  kPath. */.static
2f460 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
2f470 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
2f480 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a  har *lockPath){.
2f490 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20    int i, len;.  
2f4a0 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48  char buf[MAXPATH
2f4b0 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72  LEN];.  int star
2f4c0 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65  t = 0;.  .  asse
2f4d0 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c  rt(lockPath!=NUL
2f4e0 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20  L);.  /* try to 
2f4f0 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69  create all the i
2f500 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65  ntermediate dire
2f510 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e  ctories */.  len
2f520 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c   = (int)strlen(l
2f530 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b  ockPath);.  buf[
2f540 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d  0] = lockPath[0]
2f550 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c  ;.  for( i=1; i<
2f560 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  len; i++ ){.    
2f570 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20  if( lockPath[i] 
2f580 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73  == '/' && (i - s
2f590 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20  tart > 0) ){.   
2f5a0 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72     /* only mkdir
2f5b0 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20   if leaf dir != 
2f5c0 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e  "." or "/" or ".
2f5d0 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ." */.      if( 
2f5e0 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d  i-start>2 || (i-
2f5f0 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b  start==1 && buf[
2f600 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
2f610 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
2f620 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  /') .         ||
2f630 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20   (i-start==2 && 
2f640 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
2f650 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31  ' && buf[start+1
2f660 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20  ] != '.') ){.   
2f670 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27       buf[i]='\0'
2f680 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 6b  ;.        if( mk
2f690 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f  dir(buf, SQLITE_
2f6a0 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
2f6b0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
2f6c0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
2f6d0 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
2f6e0 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
2f6f0 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20  IST ) {.        
2f700 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52      OSTRACE(("CR
2f710 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41  EATELOCKPATH  FA
2f720 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73  ILED creating %s
2f730 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
2f740 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70           "'%s' p
2f750 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
2f760 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  s pid=%d\n",.   
2f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f780 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28    buf, strerror(
2f790 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  err), lockPath, 
2f7a0 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
2f7b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65          return e
2f7c0 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rr;.          }.
2f7d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f7e0 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b  }.      start=i+
2f7f0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66  1;.    }.    buf
2f800 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69  [i] = lockPath[i
2f810 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  ];.  }.  OSTRACE
2f820 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54  (("CREATELOCKPAT
2f830 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
2f840 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
2f850 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69   lockPath, getpi
2f860 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d()));.  return 
2f870 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
2f880 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c  te a new VFS fil
2f890 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74  e descriptor (st
2f8a0 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ored in memory o
2f8b0 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
2f8c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
2f8d0 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c  and open the fil
2f8e0 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69  e named "path" i
2f8f0 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
2f900 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iptor..**.** The
2f910 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
2f920 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20  nsible not only 
2f930 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  for closing the 
2f940 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
2f950 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20  ** but also for 
2f960 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f  freeing the memo
2f970 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
2f980 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  th the file desc
2f990 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  riptor..*/.stati
2f9a0 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
2f9b0 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63  eUnixFile(.    c
2f9c0 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
2f9d0 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20          /* path 
2f9e0 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
2f9f0 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  File */.    unix
2fa00 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20  File **ppFile,  
2fa10 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65       /* unixFile
2fa20 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74   created and ret
2fa30 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a  urned by ref */.
2fa40 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69      int islockfi
2fa50 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le           /* 
2fa60 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73  if non zero miss
2fa70 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65  ing dirs will be
2fa80 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a   created */.) {.
2fa90 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
2faa0 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b   int dirfd = -1;
2fab0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2fac0 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
2fad0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f  LITE_OK;.  int o
2fae0 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
2faf0 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73  R | O_CREAT;.  s
2fb00 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79  qlite3_vfs dummy
2fb10 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e  Vfs;.  int terrn
2fb20 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75  o = 0;.  UnixUnu
2fb30 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
2fb40 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20   NULL;..  /* 1. 
2fb50 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65  first try to ope
2fb60 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
2fb70 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61  e.  ** 2. if tha
2fb80 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69  t fails, and thi
2fb90 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65  s is a lock file
2fba0 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72   (not-conch), tr
2fbb0 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  y creating.  ** 
2fbc0 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
2fbd0 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20  tories and then 
2fbe0 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20  try again..  ** 
2fbf0 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  3. if that fails
2fc00 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68  , try to open th
2fc10 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79  e file read-only
2fc20 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  .  ** otherwise 
2fc30 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20  return BUSY (if 
2fc40 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41  lock file) or CA
2fc50 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63  NTOPEN for the c
2fc60 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20  onch file.  */. 
2fc70 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
2fc80 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20  eusableFd(path, 
2fc90 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66  openFlags);.  if
2fca0 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
2fcb0 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
2fcc0 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
2fcd0 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
2fce0 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2fcf0 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
2fd00 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
2fd10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2fd20 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2fd30 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
2fd40 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ){.    fd = robu
2fd50 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
2fd60 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f  enFlags, SQLITE_
2fd70 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2fd80 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74  MISSIONS);.    t
2fd90 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
2fda0 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
2fdb0 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20  rrno==ENOENT && 
2fdc0 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
2fdd0 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65      if( proxyCre
2fde0 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68  ateLockPath(path
2fdf0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  ) == SQLITE_OK )
2fe00 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72  {.        fd = r
2fe10 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c  obust_open(path,
2fe20 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49   openFlags, SQLI
2fe30 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2fe40 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
2fe50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2fe60 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2fe70 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f    openFlags = O_
2fe80 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d  RDONLY;.    fd =
2fe90 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
2fea0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
2feb0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2fec0 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
2fed0 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72      terrno = err
2fee0 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  no;.  }.  if( fd
2fef0 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  <0 ){.    if( is
2ff00 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20  lockfile ){.    
2ff10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ff20 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
2ff30 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20  switch (terrno) 
2ff40 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43  {.      case EAC
2ff50 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74  CES:.        ret
2ff60 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
2ff70 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a  .      case EIO:
2ff80 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e   .        return
2ff90 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
2ffa0 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75  CK; /* even thou
2ffb0 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e  gh it is the con
2ffc0 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61  ch */.      defa
2ffd0 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74  ult:.        ret
2ffe0 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
2fff0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
30000 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20    }.  .  pNew = 
30010 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69  (unixFile *)sqli
30020 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
30030 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28  f(*pNew));.  if(
30040 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20   pNew==NULL ){. 
30050 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
30060 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65  OMEM;.    goto e
30070 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b  nd_create_proxy;
30080 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e  .  }.  memset(pN
30090 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  ew, 0, sizeof(un
300a0 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77  ixFile));.  pNew
300b0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
300c0 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65  enFlags;.  memse
300d0 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20  t(&dummyVfs, 0, 
300e0 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29  sizeof(dummyVfs)
300f0 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41  );.  dummyVfs.pA
30100 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  ppData = (void*)
30110 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  &autolockIoFinde
30120 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e  r;.  dummyVfs.zN
30130 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20  ame = "dummy";. 
30140 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66   pUnused->fd = f
30150 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c  d;.  pUnused->fl
30160 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
30170 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64  .  pNew->pUnused
30180 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20   = pUnused;.  . 
30190 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
301a0 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20  File(&dummyVfs, 
301b0 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71 6c 69  fd, dirfd, (sqli
301c0 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20  te3_file*)pNew, 
301d0 70 61 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  path, 0, 0, 0);.
301e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
301f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69  _OK ){.    *ppFi
30200 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  le = pNew;.    r
30210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30220 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f  .  }.end_create_
30230 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62  proxy:    .  rob
30240 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
30250 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
30260 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
30270 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ew);.  sqlite3_f
30280 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
30290 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
302a0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
302b0 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
302c0 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
302d0 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
302e0 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
302f0 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
30300 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
30310 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
30320 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
30330 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20     16  /* conch 
30340 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e  file host id len
30350 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61  gth */../* Not a
30360 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e  lways defined in
30370 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20   the headers as 
30380 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a  it ought to be *
30390 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74  /.extern int get
303a0 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20  hostuuid(uuid_t 
303b0 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74  id, const struct
303c0 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29   timespec *wait)
303d0 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f  ;../* get the ho
303e0 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73  st ID via gethos
303f0 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44  tuuid(), pHostID
30400 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50   must point to P
30410 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a  ROXY_HOSTIDLEN .
30420 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74  ** bytes of writ
30430 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  able memory..*/.
30440 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
30450 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e  GetHostID(unsign
30460 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ed char *pHostID
30470 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a  , int *pError){.
30480 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
30490 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
304a0 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d  of(uuid_t));.  m
304b0 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30  emset(pHostID, 0
304c0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
304d0 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  N);.#if defined(
304e0 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49  __MAX_OS_X_VERSI
304f0 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29  ON_MIN_REQUIRED)
30500 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
30510 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56   && __MAC_OS_X_V
30520 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49  ERSION_MIN_REQUI
30530 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20  RED<1050.  {.   
30540 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
30550 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69  ruct timespec ti
30560 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20  meout = {1, 0}; 
30570 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74  /* 1 sec timeout
30580 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68   */.    if( geth
30590 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c  ostuuid(pHostID,
305a0 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20   &timeout) ){.  
305b0 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
305c0 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rno;.      if( p
305d0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
305e0 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a   *pError = err;.
305f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
30600 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
30610 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
30620 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
30630 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75  E_TEST.  /* simu
30640 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
30650 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
30660 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
30670 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66  le paths */.  if
30680 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
30690 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20  _num != 0){.    
306a0 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68  pHostID[0] = (ch
306b0 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b  ar)(pHostID[0] +
306c0 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f   (char)(sqlite3_
306d0 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46  hostid_num & 0xF
306e0 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  F));.  }.#endif.
306f0 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
30700 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
30710 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
30720 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c  ains the header,
30730 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63   host id and loc
30740 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a  k file path. */.
30750 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f  #define PROXY_CO
30760 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f  NCHVERSION 2   /
30770 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c  * 1-byte header,
30780 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64   16-byte host id
30790 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e  , path */.#defin
307a0 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  e PROXY_HEADERLE
307b0 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63  N    1   /* conc
307c0 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65  h file header le
307d0 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ngth */.#define 
307e0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
307f0 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52     (PROXY_HEADER
30800 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
30810 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f  LEN).#define PRO
30820 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20  XY_MAXCONCHLEN  
30830 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
30840 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
30850 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a  +MAXPATHLEN)../*
30860 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70   .** Takes an op
30870 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63  en conch file, c
30880 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  opies the conten
30890 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68  ts to a new path
308a0 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20   and then moves 
308b0 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68  .** it back.  Th
308c0 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  e newly created 
308d0 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63  file's file desc
308e0 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e  riptor is assign
308f0 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ed to the.** con
30900 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  ch file structur
30910 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68  e and finally th
30920 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68  e original conch
30930 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
30940 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20   is .** closed. 
30950 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   Returns zero if
30960 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
30970 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
30980 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75  BreakConchLock(u
30990 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
309a0 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29  uuid_t myHostID)
309b0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
309c0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
309d0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
309e0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
309f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
30a00 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
30a10 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
30a20 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74  chFile;.  char t
30a30 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
30a40 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f  ;.  char buf[PRO
30a50 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
30a60 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d  .  char *cPath =
30a70 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
30a80 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72  Path;.  size_t r
30a90 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69  eadLen = 0;.  si
30aa0 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30  ze_t pathLen = 0
30ab0 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b  ;.  char errmsg[
30ac0 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20  64] = "";.  int 
30ad0 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  fd = -1;.  int r
30ae0 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44  c = -1;.  UNUSED
30af0 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73  _PARAMETER(myHos
30b00 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61  tID);..  /* crea
30b10 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79  te a new path by
30b20 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61   replace the tra
30b30 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77  iling '-conch' w
30b40 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a  ith '-break' */.
30b50 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c    pathLen = strl
30b60 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68  cpy(tPath, cPath
30b70 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
30b80 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58   if( pathLen>MAX
30b90 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c  PATHLEN || pathL
30ba0 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73  en<6 || .     (s
30bb0 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61  trlcpy(&tPath[pa
30bc0 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b  thLen-5], "break
30bd0 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20  ", 6) != 5) ){. 
30be0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
30bf0 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
30c00 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20  g),errmsg,"path 
30c10 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
30c20 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20  (int)pathLen);. 
30c30 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
30c40 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
30c50 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63  read the conch c
30c60 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64  ontent */.  read
30c70 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  Len = osPread(co
30c80 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
30c90 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
30ca0 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
30cb0 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
30cc0 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c  INDEX ){.    sql
30cd0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
30ce0 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72  zeof(errmsg),err
30cf0 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20  msg,"read error 
30d00 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72  (len %d)",(int)r
30d10 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
30d20 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
30d30 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
30d40 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
30d50 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
30d60 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62  le */.  fd = rob
30d70 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20  ust_open(tPath, 
30d80 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
30d90 4f 5f 45 58 43 4c 29 2c 0a 20 20 20 20 20 20 20  O_EXCL),.       
30da0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
30db0 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
30dc0 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
30dd0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
30de0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
30df0 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
30e00 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65   errmsg, "create
30e10 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
30e20 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
30e30 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
30e40 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74   }.  if( osPwrit
30e50 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c  e(fd, buf, readL
30e60 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65  en, 0) != (ssize
30e70 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20  _t)readLen ){.  
30e80 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
30e90 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
30ea0 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74  ), errmsg, "writ
30eb0 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
30ec0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
30ed0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
30ee0 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65    }.  if( rename
30ef0 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29  (tPath, cPath) )
30f00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
30f10 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
30f20 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
30f30 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25  rename failed (%
30f40 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
30f50 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
30f60 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ock;.  }.  rc = 
30f70 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  0;.  fprintf(std
30f80 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c  err, "broke stal
30f90 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c  e lock on %s\n",
30fa0 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73   cPath);.  robus
30fb0 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63  t_close(pFile, c
30fc0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  onchFile->h, __L
30fd0 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46  INE__);.  conchF
30fe0 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63  ile->h = fd;.  c
30ff0 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
31000 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
31010 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65  _CREAT;..end_bre
31020 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63  aklock:.  if( rc
31030 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d   ){.    if( fd>=
31040 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  0 ){.      unlin
31050 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20  k(tPath);.      
31060 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
31070 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  le, fd, __LINE__
31080 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
31090 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61  intf(stderr, "fa
310a0 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74  iled to break st
310b0 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20  ale lock on %s, 
310c0 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72  %s\n", cPath, er
310d0 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rmsg);.  }.  ret
310e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61  urn rc;.}../* Ta
310f0 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ke the requested
31100 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
31110 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61  ch file and brea
31120 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69  k a stale lock i
31130 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69  f the .** host i
31140 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74  d matches..*/.st
31150 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f  atic int proxyCo
31160 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
31170 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
31180 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f  myHostID, int lo
31190 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79  ckType){.  proxy
311a0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
311b0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
311c0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
311d0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
311e0 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
311f0 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
31200 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
31210 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
31220 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65  _OK;.  int nTrie
31230 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  s = 0;.  struct 
31240 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f  timespec conchMo
31250 64 54 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20 7b  dTime;.  .  do {
31260 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46  .    rc = conchF
31270 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
31280 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
31290 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f  e*)conchFile, lo
312a0 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72  ckType);.    nTr
312b0 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20  ies ++;.    if( 
312c0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
312d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
312e0 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28  he lock failed (
312f0 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20  busy):.       * 
31300 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65  1st try: get the
31310 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65   mod time of the
31320 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35   conch, wait 0.5
31330 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
31340 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74   .       * 2nd t
31350 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20  ry: fail if the 
31360 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64  mod time changed
31370 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64   or host id is d
31380 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a  ifferent, wait .
31390 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20         *        
313a0 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72     10 sec and tr
313b0 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a  y again.       *
313c0 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20   3rd try: break 
313d0 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20  the lock unless 
313e0 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73  the mod time has
313f0 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20   changed..      
31400 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
31410 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
31420 20 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e   if( osFstat(con
31430 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  chFile->h, &buf)
31440 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
31450 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
31460 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
31470 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
31480 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  R_LOCK;.      }.
31490 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
314a0 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20   nTries==1 ){.  
314b0 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69        conchModTi
314c0 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  me = buf.st_mtim
314d0 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75  espec;.        u
314e0 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f  sleep(500000); /
314f0 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61  * wait 0.5 sec a
31500 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
31510 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20  again*/.        
31520 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
31530 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
31540 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20  t( nTries>1 );. 
31550 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f       if( conchMo
31560 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20  dTime.tv_sec != 
31570 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
31580 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20  .tv_sec || .    
31590 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
315a0 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66  e.tv_nsec != buf
315b0 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
315c0 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20  _nsec ){.       
315d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
315e0 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  USY;.      }.   
315f0 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
31600 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20  ries==2 ){  .   
31610 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50       char tBuf[P
31620 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
31630 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ];.        int l
31640 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e  en = osPread(con
31650 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c  chFile->h, tBuf,
31660 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
31670 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  EN, 0);.        
31680 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  if( len<0 ){.   
31690 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
316a0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
316b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
316c0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
316d0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  OCK;.        }. 
316e0 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50         if( len>P
316f0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26  ROXY_PATHINDEX &
31700 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72  & tBuf[0]==(char
31710 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
31720 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ION){.          
31730 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
31740 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68  he lock if the h
31750 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d  ost id doesn't m
31760 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
31770 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28    if( 0!=memcmp(
31780 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  &tBuf[PROXY_HEAD
31790 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
317a0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
317b0 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
317c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
317d0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
317e0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
317f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
31800 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
31810 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64  ck on short read
31820 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69   or a version mi
31830 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20  smatch */.      
31840 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31850 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
31860 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  }.        usleep
31870 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77  (10000000); /* w
31880 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74  ait 10 sec and t
31890 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
318a0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  n */.        con
318b0 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a  tinue; .      }.
318c0 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73        .      ass
318d0 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29  ert( nTries==3 )
318e0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
318f0 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
31900 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
31910 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ID) ){.        r
31920 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31930 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54         if( lockT
31940 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
31950 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OCK ){.         
31960 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
31970 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
31980 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
31990 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
319a0 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20  _LOCK);         
319b0 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
319c0 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
319d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
319e0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
319f0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
31a00 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
31a10 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
31a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
31a30 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20     }.  } while( 
31a40 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
31a50 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20  && nTries<3 );. 
31a60 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
31a70 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63  ../* Takes the c
31a80 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61  onch by taking a
31a90 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
31aa0 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
31ab0 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a  ts conch, if .**
31ac0 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e   lockPath is non
31ad0 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20  -NULL, the host 
31ae0 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ID and lock file
31af0 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68   path must match
31b00 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f  .  A NULL .** lo
31b10 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61  ckPath means tha
31b20 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69  t the lockPath i
31b30 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
31b40 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66   will be used if
31b50 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44   the .** host ID
31b60 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65  s match, or a ne
31b70 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  w lock path will
31b80 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75   be generated au
31b90 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
31ba0 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  and written to t
31bb0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  he conch file..*
31bc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
31bd0 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78  xyTakeConch(unix
31be0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
31bf0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
31c00 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
31c10 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
31c20 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
31c30 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20  gContext; .  .  
31c40 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
31c50 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  eld!=0 ){.    re
31c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
31c80 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
31c90 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
31ca0 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d  le;.    uuid_t m
31cb0 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74  yHostID;.    int
31cc0 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20   pError = 0;.   
31cd0 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52   char readBuf[PR
31ce0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
31cf0 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50  ;.    char lockP
31d00 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
31d10 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c  .    char *tempL
31d20 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  ockPath = NULL;.
31d30 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
31d40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20  ITE_OK;.    int 
31d50 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b  createConch = 0;
31d60 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d  .    int hostIdM
31d70 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  atch = 0;.    in
31d80 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
31d90 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63     int tryOldLoc
31da0 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69  kPath = 0;.    i
31db0 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50  nt forceNewLockP
31dc0 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20  ath = 0;.    .  
31dd0 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45    OSTRACE(("TAKE
31de0 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
31df0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
31e00 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
31e10 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
31e20 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
31e30 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
31e40 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
31e50 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20  etpid()));..    
31e60 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73  rc = proxyGetHos
31e70 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70  tID(myHostID, &p
31e80 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  Error);.    if( 
31e90 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
31ea0 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20  E_IOERR ){.     
31eb0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
31ec0 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  o = pError;.    
31ed0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
31ee0 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
31ef0 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
31f00 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
31f10 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  tID, SHARED_LOCK
31f20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31f30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31f40 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
31f50 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
31f60 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73  /* read the exis
31f70 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20  ting conch file 
31f80 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d  */.    readLen =
31f90 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
31fa0 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  ixFile*)conchFil
31fb0 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50  e, 0, readBuf, P
31fc0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
31fd0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c  );.    if( readL
31fe0 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  en<0 ){.      /*
31ff0 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74   I/O error: last
32000 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
32010 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
32020 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
32030 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  no = conchFile->
32040 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
32050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
32060 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67  RR_READ;.      g
32070 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
32080 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  h;.    }else if(
32090 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59   readLen<=(PROXY
320a0 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
320b0 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a  _HOSTIDLEN) || .
320c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
320d0 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50  dBuf[0]!=(char)P
320e0 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
320f0 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  N ){.      /* a 
32100 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65  short read or ve
32110 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73  rsion format mis
32120 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e  match means we n
32130 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
32140 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  new .      ** co
32150 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nch file. .     
32160 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65   */.      create
32170 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Conch = 1;.    }
32180 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68  .    /* if the h
32190 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61  ost id matches a
321a0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  nd the lock path
321b0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
321c0 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20  in the conch.   
321d0 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f   ** we'll try to
321e0 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68   use the path th
321f0 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74  ere, if we can't
32200 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c   open that path,
32210 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72   we'll .    ** r
32220 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20  etry with a new 
32230 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70  auto-generated p
32240 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ath .    */.    
32250 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20  do { /* in case 
32260 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61  we need to try a
32270 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74  gain for an :aut
32280 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69  o: named lock fi
32290 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  le */..      if(
322a0 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26   !createConch &&
322b0 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61   !forceNewLockPa
322c0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f  th ){.        ho
322d0 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d  stIdMatch = !mem
322e0 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f  cmp(&readBuf[PRO
322f0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
32300 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20  yHostID, .      
32310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32320 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58              PROX
32330 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
32340 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
32350 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63  conch has data c
32360 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
32370 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nts */.        i
32380 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
32390 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
323a0 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f       /* for auto
323b0 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63  -named local loc
323c0 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65  k file, just che
323d0 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  ck the host ID a
323e0 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20  nd we'll.       
323f0 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c      ** use the l
32400 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70  ocal lock file p
32410 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61  ath that's alrea
32420 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20  dy in there.    
32430 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32440 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61      if( hostIdMa
32450 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
32460 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65     size_t pathLe
32470 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50  n = (readLen - P
32480 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b  ROXY_PATHINDEX);
32490 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
324a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
324b0 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45  thLen>=MAXPATHLE
324c0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
324d0 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41     pathLen=MAXPA
324e0 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20  THLEN-1;.       
324f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32500 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61     memcpy(lockPa
32510 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f  th, &readBuf[PRO
32520 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70  XY_PATHINDEX], p
32530 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20  athLen);.       
32540 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61       lockPath[pa
32550 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  thLen] = 0;.    
32560 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
32570 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
32580 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
32590 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  OldLockPath = 1;
325a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
325b0 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
325c0 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69   the lock path i
325d0 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
325e0 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  aken */.        
325f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
32600 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
32610 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
32620 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63  e if( hostIdMatc
32630 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h.              
32640 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74   && !strncmp(pCt
32650 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
32660 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  , &readBuf[PROXY
32670 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20  _PATHINDEX],.   
32680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32690 20 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d          readLen-
326a0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29  PROXY_PATHINDEX)
326b0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
326c0 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68        /* conch h
326d0 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74  ost and lock pat
326e0 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  h match */.     
326f0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
32700 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20  keconch; .      
32710 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
32720 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74    .      /* if t
32730 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77  he conch isn't w
32740 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73  ritable and does
32750 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61  n't match, we ca
32760 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20  n't take it */. 
32770 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46       if( (conchF
32780 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f  ile->openFlags&O
32790 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20  _RDWR) == 0 ){. 
327a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
327b0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
327c0 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
327d0 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nch;.      }.   
327e0 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74     .      /* eit
327f0 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69  her the conch di
32800 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65  dn't match or we
32810 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
32820 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20  a new one */.   
32830 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
32840 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
32850 20 20 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c         proxyGetL
32860 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62  ockPath(pCtx->db
32870 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  Path, lockPath, 
32880 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
32890 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
328a0 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
328b0 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
328c0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
328d0 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69  ck path _only_ i
328e0 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
328f0 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  aken */.      }.
32900 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
32910 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74  update conch wit
32920 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20  h host and path 
32930 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20  (this will fail 
32940 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  if other process
32950 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20  .      ** has a 
32960 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65  shared lock alre
32970 61 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73  ady), if the hos
32980 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73  t id matches, us
32990 65 20 74 68 65 20 62 69 67 0a 20 20 20 20 20 20  e the big.      
329a0 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20  ** stick..      
329b0 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73  */.      futimes
329c0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e  (conchFile->h, N
329d0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ULL);.      if( 
329e0 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20 21  hostIdMatch && !
329f0 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20  createConch ){. 
32a00 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68         if( conch
32a10 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20  File->pInode && 
32a20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64  conchFile->pInod
32a30 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
32a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
32a50 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
32a60 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
32a70 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
32a80 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
32a90 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70         ** same p
32aa0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
32ab0 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
32ac0 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   lock. */.      
32ad0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32ae0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20  BUSY;.        } 
32af0 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 20  else {          
32b00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32b10 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
32b20 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
32b30 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
32b40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32b50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32b60 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
32b70 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
32b80 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
32b90 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49  nchFile, EXCLUSI
32ba0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
32bb0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
32bc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32bd0 20 20 20 20 20 63 68 61 72 20 77 72 69 74 65 42       char writeB
32be0 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43  uffer[PROXY_MAXC
32bf0 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
32c00 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20    int writeSize 
32c10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 0;.        .  
32c20 20 20 20 20 20 20 77 72 69 74 65 42 75 66 66 65        writeBuffe
32c30 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f  r[0] = (char)PRO
32c40 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b  XY_CONCHVERSION;
32c50 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
32c60 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
32c70 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
32c80 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
32c90 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
32ca0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
32cb0 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c  kProxyPath!=NULL
32cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
32cd0 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
32ce0 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
32cf0 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  EX], pCtx->lockP
32d00 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
32d10 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d  HLEN);.        }
32d20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
32d30 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75  strlcpy(&writeBu
32d40 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
32d50 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50  NDEX], tempLockP
32d60 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
32d70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32d80 20 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20      writeSize = 
32d90 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
32da0 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42  + strlen(&writeB
32db0 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
32dc0 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20  INDEX]);.       
32dd0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
32de0 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  e(conchFile->h, 
32df0 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20  writeSize);.    
32e00 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69      rc = unixWri
32e10 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
32e20 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72   *)conchFile, wr
32e30 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74 65  iteBuffer, write
32e40 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
32e50 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c    fsync(conchFil
32e60 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f  e->h);.        /
32e70 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20  * If we created 
32e80 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65  a new conch file
32e90 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74   (not just updat
32ea0 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ed the contents 
32eb0 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a  of a .         *
32ec0 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69  * valid conch fi
32ed0 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63  le), try to matc
32ee0 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
32ef0 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
32f00 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  e .         */. 
32f10 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
32f20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61  QLITE_OK && crea
32f30 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20  teConch ){.     
32f40 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
32f50 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20   buf;.          
32f60 69 6e 74 20 65 72 72 20 3d 20 6f 73 46 73 74 61  int err = osFsta
32f70 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
32f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
32f90 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20   err==0 ){.     
32fa0 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d         mode_t cm
32fb0 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64  ode = buf.st_mod
32fc0 65 26 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55  e&(S_IRUSR|S_IWU
32fd0 53 52 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49  SR | S_IRGRP|S_I
32fe0 57 47 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20  WGRP |.         
32ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
33010 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b  _IROTH|S_IWOTH);
33020 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
33030 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
33040 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 52   database file R
33050 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20  /W permissions, 
33060 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a  ignore failure *
33070 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
33080 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20  _PROXY_DEBUG.   
33090 20 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f           osFchmo
330a0 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
330b0 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20  cmode);.#else.  
330c0 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20            do{.  
330d0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
330e0 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46   osFchmod(conchF
330f0 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a  ile->h, cmode);.
33100 20 20 20 20 20 20 20 20 20 20 20 20 7d 77 68 69              }whi
33110 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20 26 26 20  le( rc==(-1) && 
33120 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
33130 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
33140 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
33150 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
33160 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
33170 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
33180 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25  tderr, "fchmod %
33190 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64  o FAILED with %d
331a0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
331b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d                cm
331c0 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72  ode, code, strer
331d0 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20  ror(code));.    
331e0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
331f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
33200 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33210 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44  fchmod %o SUCCED
33220 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20  ED\n",cmode);.  
33230 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33240 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33250 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64           int cod
33260 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
33270 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
33280 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49  tderr, "STAT FAI
33290 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20  LED[%d] with %d 
332a0 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
332b0 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c              err,
332c0 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28   code, strerror(
332d0 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20  code));.#endif. 
332e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
332f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33300 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
33310 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
33320 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
33330 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
33340 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20  LOCK);.      .  
33350 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a    end_takeconch:
33360 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
33370 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f  "TRANSPROXY: CLO
33380 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  SE  %d\n", pFile
33390 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ->h));.      if(
333a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
333b0 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  & pFile->openFla
333c0 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  gs ){.        if
333d0 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
333e0 0a 20 20 20 20 20 20 20 20 20 20 72 6f 62 75 73  .          robus
333f0 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
33400 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
33410 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _);.        }.  
33420 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
33430 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   -1;.        int
33440 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
33450 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  n(pCtx->dbPath, 
33460 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
33470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33480 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
33490 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
334a0 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20  ISSIONS);.      
334b0 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e    OSTRACE(("TRAN
334c0 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64  SPROXY: OPEN  %d
334d0 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20 20  \n", fd));.     
334e0 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
334f0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
33500 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20  >h = fd;.       
33510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33520 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54    rc=SQLITE_CANT
33530 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51  OPEN_BKPT; /* SQ
33540 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79  LITE_BUSY? proxy
33550 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64  TakeConch called
33560 0a 20 20 20 20 20 20 20 20 20 20 20 64 75 72 69  .           duri
33570 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  ng locking */.  
33580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33590 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
335a0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78  LITE_OK && !pCtx
335b0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20  ->lockProxy ){. 
335c0 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 61 74         char *pat
335d0 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  h = tempLockPath
335e0 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20   ? tempLockPath 
335f0 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  : pCtx->lockProx
33600 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72  yPath;.        r
33610 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55  c = proxyCreateU
33620 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70  nixFile(path, &p
33630 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20  Ctx->lockProxy, 
33640 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
33650 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
33660 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
33670 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50  M && tryOldLockP
33680 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
33690 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20   /* we couldn't 
336a0 63 72 65 61 74 65 20 74 68 65 20 70 72 6f 78 79  create the proxy
336b0 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20   lock file with 
336c0 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c  the old lock fil
336d0 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
336e0 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69    ** so try agai
336f0 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e  n via auto-namin
33700 67 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  g .           */
33710 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 63 65  .          force
33720 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  NewLockPath = 1;
33730 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c  .          tryOl
33740 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  dLockPath = 0;. 
33750 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
33760 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f  e; /* go back to
33770 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65   the do {} while
33780 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72   start point, tr
33790 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  y again */.     
337a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
337b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
337c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
337d0 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
337e0 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69  a copy of path i
337f0 66 20 77 65 20 65 78 74 72 61 63 74 65 64 20 74  f we extracted t
33800 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  he value.       
33810 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f    ** from the co
33820 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20  nch file or the 
33830 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74  path was allocat
33840 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a  ed on the stack.
33850 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
33860 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b      if( tempLock
33870 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
33880 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
33890 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
338a0 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c  bStrDup(0, tempL
338b0 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ockPath);.      
338c0 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
338d0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
338e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
338f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
33900 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33910 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33920 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33940 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
33950 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 1;.        .  
33960 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
33970 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
33980 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  od == &afpIoMeth
33990 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ods ){.         
339a0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
339b0 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20  xt *afpCtx;.    
339c0 20 20 20 20 20 20 61 66 70 43 74 78 20 3d 20 28        afpCtx = (
339d0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
339e0 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  t *)pCtx->lockPr
339f0 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oxy->lockingCont
33a00 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ext;.          a
33a10 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20  fpCtx->dbPath = 
33a20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
33a30 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ath;.        }. 
33a40 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
33a50 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d        conchFile-
33a60 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
33a70 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
33a80 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c  )conchFile, NO_L
33a90 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
33aa0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41      OSTRACE(("TA
33ab0 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e  KECONCH  %d %s\n
33ac0 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
33ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33ae0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f  rc==SQLITE_OK?"o
33af0 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a 20  k":"failed"));. 
33b00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33b10 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31 29 3b      } while (1);
33b20 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e   /* in case we n
33b30 65 65 64 20 74 6f 20 72 65 74 72 79 20 74 68 65  eed to retry the
33b40 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c   :auto: lock fil
33b50 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20 20 20  e - .           
33b60 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
33b70 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68 65 72  ld never get her
33b80 65 20 65 78 63 65 70 74 20 76 69 61 20 74 68 65  e except via the
33b90 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c   'continue' call
33ba0 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  . */.  }.}../*.*
33bb0 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73  * If pFile holds
33bc0 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e   a lock on a con
33bd0 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ch file, then re
33be0 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e  lease that lock.
33bf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
33c00 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68  roxyReleaseConch
33c10 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
33c20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33c30 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
33c40 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72   /* Subroutine r
33c50 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
33c60 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
33c70 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54  ext *pCtx;  /* T
33c80 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
33c90 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79  xt for the proxy
33ca0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46   lock */.  unixF
33cb0 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20  ile *conchFile; 
33cc0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
33cd0 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
33ce0 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70   */..  pCtx = (p
33cf0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33d00 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
33d10 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f  ingContext;.  co
33d20 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
33d30 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54  conchFile;.  OST
33d40 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f  RACE(("RELEASECO
33d50 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
33d60 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
33d70 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
33d80 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
33d90 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
33da0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
33db0 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20  ":auto:"), .    
33dc0 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
33dd0 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63  );.  if( pCtx->c
33de0 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
33df0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
33e00 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
33e10 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
33e20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
33e30 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74  LOCK);.  }.  pCt
33e40 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30  x->conchHeld = 0
33e50 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
33e60 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25  LEASECONCH  %d %
33e70 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  s\n", conchFile-
33e80 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
33e90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
33ea0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
33eb0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
33ec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
33ed0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
33ee0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d  tabase file, com
33ef0 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  pute the name of
33f00 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e   its conch file.
33f10 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f  .** Store the co
33f20 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  nch filename in 
33f30 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
33f40 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
33f50 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a  loc()..** Make *
33f60 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74  pConchPath point
33f70 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65   to the new name
33f80 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
33f90 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
33fa0 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
33fb0 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f  M if unable to o
33fc0 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  btain memory..**
33fd0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
33fe0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
33ff0 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
34000 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
34010 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73  mory.** space is
34020 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
34030 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68  d..**.** *pConch
34040 50 61 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e  Path is set to N
34050 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  ULL if a memory 
34060 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
34070 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
34080 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
34090 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28  teConchPathname(
340a0 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
340b0 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29  ar **pConchPath)
340c0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
340d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
340e0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
340f0 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d  r */.  int len =
34100 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50   (int)strlen(dbP
34110 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20  ath); /* Length 
34120 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
34130 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f  name - dbPath */
34140 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61  .  char *conchPa
34150 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
34160 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68   /* buffer in wh
34170 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ich to construct
34180 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a   conch name */..
34190 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
341a0 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ace for the conc
341b0 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  h filename and i
341c0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61  nitialize the na
341d0 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e  me to.  ** the n
341e0 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ame of the origi
341f0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
34200 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63  e. */  .  *pConc
34210 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74  hPath = conchPat
34220 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  h = (char *)sqli
34230 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b  te3_malloc(len +
34240 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68   8);.  if( conch
34250 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Path==0 ){.    r
34260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
34270 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  EM;.  }.  memcpy
34280 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61  (conchPath, dbPa
34290 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20  th, len+1);.  . 
342a0 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61   /* now insert a
342b0 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20   "." before the 
342c0 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74 65 72  last / character
342d0 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65   */.  for( i=(le
342e0 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20  n-1); i>=0; i-- 
342f0 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68  ){.    if( conch
34300 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[i]=='/' ){.
34310 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
34320 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
34330 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d  }.  conchPath[i]
34340 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20  ='.';.  while ( 
34350 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e  i<len ){.    con
34360 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61  chPath[i+1]=dbPa
34370 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a  th[i];.    i++;.
34380 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64    }..  /* append
34390 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75   the "-conch" su
343a0 66 66 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65  ffix to the file
343b0 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f   */.  memcpy(&co
343c0 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d  nchPath[i+1], "-
343d0 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73  conch", 7);.  as
343e0 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65  sert( (int)strle
343f0 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20  n(conchPath) == 
34400 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75  len+7 );..  retu
34410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
34420 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c  ../* Takes a ful
34430 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72  ly configured pr
34440 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c  oxy locking-styl
34450 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  e unix file and 
34460 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20  switches.** the 
34470 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20  local lock file 
34480 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20  path .*/.static 
34490 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72  int switchLockPr
344a0 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65  oxyPath(unixFile
344b0 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63   *pFile, const c
344c0 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70  har *path) {.  p
344d0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
344e0 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
344f0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
34500 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34510 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a  ontext;.  char *
34520 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e  oldPath = pCtx->
34530 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
34540 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
34550 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c  _OK;..  if( pFil
34560 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
34570 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
34580 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
34590 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74  .  }  ..  /* not
345a0 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68  hing to do if th
345b0 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20  e path is NULL, 
345c0 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65  :auto: or matche
345d0 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 70  s the existing p
345e0 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21 70 61  ath */.  if( !pa
345f0 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27  th || path[0]=='
34600 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70  \0' || !strcmp(p
34610 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c  ath, ":auto:") |
34620 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26  |.    (oldPath &
34630 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61  & !strncmp(oldPa
34640 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54  th, path, MAXPAT
34650 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20 72 65  HLEN)) ){.    re
34660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
34680 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
34690 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
346a0 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f  xy;.    pCtx->lo
346b0 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20  ckProxy=NULL;.  
346c0 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
346d0 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c  d = 0;.    if( l
346e0 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29  ockProxy!=NULL )
346f0 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50  {.      rc=lockP
34700 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
34710 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
34720 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29  ile *)lockProxy)
34730 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
34740 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34750 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c    sqlite3_free(l
34760 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d  ockProxy);.    }
34770 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
34780 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20 20  e(oldPath);.    
34790 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
347a0 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
347b0 74 72 44 75 70 28 30 2c 20 70 61 74 68 29 3b 0a  trDup(0, path);.
347c0 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
347d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69  rc;.}../*.** pFi
347e0 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74 68 61  le is a file tha
347f0 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65  t has been opene
34800 64 20 62 79 20 61 20 70 72 69 6f 72 20 78 4f 70  d by a prior xOp
34810 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61 74 68  en call.  dbPath
34820 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20  .** is a string 
34830 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20  buffer at least 
34840 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63 68 61  MAXPATHLEN+1 cha
34850 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a 65 2e  racters in size.
34860 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
34870 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66 69 6c  ine find the fil
34880 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64  ename associated
34890 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e 64 20   with pFile and 
348a0 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74  writes it.** int
348b0 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74   dbPath..*/.stat
348c0 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44  ic int proxyGetD
348d0 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
348e0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
348f0 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29 7b  , char *dbPath){
34900 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
34910 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70 46  PPLE__).  if( pF
34920 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
34930 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
34940 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c  .    /* afp styl
34950 65 20 6b 65 65 70 73 20 61 20 72 65 66 65 72 65  e keeps a refere
34960 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20 70 61  nce to the db pa
34970 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65 50 61  th in the filePa
34980 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a  th field .    **
34990 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 20 2a   of the struct *
349a0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69  /.    assert( (i
349b0 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a  nt)strlen((char*
349c0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
349d0 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48  ontext)<=MAXPATH
349e0 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63  LEN );.    strlc
349f0 70 79 28 64 62 50 61 74 68 2c 20 28 28 61 66 70  py(dbPath, ((afp
34a00 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
34a10 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34a20 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c  ontext)->dbPath,
34a30 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
34a40 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
34a50 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
34a60 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  od == &dotlockIo
34a70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
34a80 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65  * dot lock style
34a90 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e   uses the lockin
34aa0 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f  g context to sto
34ab0 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a  re the dot lock.
34ac0 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68      ** file path
34ad0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20   */.    int len 
34ae0 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a  = strlen((char *
34af0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34b00 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e  ontext) - strlen
34b10 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29  (DOTLOCK_SUFFIX)
34b20 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50  ;.    memcpy(dbP
34b30 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
34b40 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
34b50 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20  xt, len + 1);.  
34b60 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c  }else{.    /* al
34b70 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75  l other styles u
34b80 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  se the locking c
34b90 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
34ba0 74 68 65 20 64 62 20 66 69 6c 65 20 70 61 74 68  the db file path
34bb0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
34bc0 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
34bd0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
34be0 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
34bf0 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   );.    strlcpy(
34c00 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29  dbPath, (char *)
34c10 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
34c20 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48 4c 45  ntext, MAXPATHLE
34c30 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  N);.  }.  return
34c40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
34c50 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c  *.** Takes an al
34c60 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20  ready filled in 
34c70 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c  unix file and al
34c80 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66  ters it so all f
34c90 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20  ile locking .** 
34ca0 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65  will be performe
34cb0 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  d on the local p
34cc0 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20  roxy lock file. 
34cd0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
34ce0 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65  ields.** are pre
34cf0 73 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f  served in the lo
34d00 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f  cking context so
34d10 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
34d20 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a  e restored and .
34d30 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72 75  ** the unix stru
34d40 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63  cture properly c
34d50 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f  leaned up at clo
34d60 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c  se time:.**  ->l
34d70 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a  ockingContext.**
34d80 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73    ->pMethod.*/.s
34d90 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
34da0 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
34db0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
34dc0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  , const char *pa
34dd0 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  th) {.  proxyLoc
34de0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
34df0 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74 68  x;.  char dbPath
34e00 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20  [MAXPATHLEN+1]; 
34e10 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
34e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34e30 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
34e40 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69  ckPath=NULL;.  i
34e50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34e60 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c  K;.  .  if( pFil
34e70 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
34e80 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
34e90 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
34ea0 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44  .  }.  proxyGetD
34eb0 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
34ec0 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b  (pFile, dbPath);
34ed0 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
34ee0 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
34ef0 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
34f00 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20  :auto:") ){.    
34f10 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
34f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b   }else{.    lock
34f30 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74  Path=(char *)pat
34f40 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52  h;.  }.  .  OSTR
34f50 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
34f60 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
34f70 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
34f80 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63  .           (loc
34f90 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68  kPath ? lockPath
34fa0 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
34fb0 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 70 43 74  tpid()));..  pCt
34fc0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
34fd0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
34fe0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d  ) );.  if( pCtx=
34ff0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
35000 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
35010 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78   }.  memset(pCtx
35020 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74  , 0, sizeof(*pCt
35030 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f  x));..  rc = pro
35040 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74  xyCreateConchPat
35050 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70  hname(dbPath, &p
35060 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
35070 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  th);.  if( rc==S
35080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35090 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
350a0 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63  UnixFile(pCtx->c
350b0 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70  onchFilePath, &p
350c0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20  Ctx->conchFile, 
350d0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
350e0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
350f0 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e  && ((pFile->open
35100 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
35110 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
35120 69 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20  if (a) the open 
35130 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f  flags are not O_
35140 52 44 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f  RDWR, (b) the co
35150 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c  nch isn't there,
35160 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63   and.      ** (c
35170 29 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  ) the file syste
35180 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  m is read-only, 
35190 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c  then enable no-l
351a0 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20  ocking access.. 
351b0 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e       ** Ugh, sin
351c0 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30  ce O_RDONLY==0x0
351d0 30 30 30 20 77 65 20 74 65 73 74 20 66 6f 72 20  000 we test for 
351e0 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e  !O_RDWR since un
351f0 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20  ixOpen asserts. 
35200 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65       ** that ope
35210 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65  nFlags will have
35220 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52   only one of O_R
35230 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e  DONLY or O_RDWR.
35240 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
35250 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
35260 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
35270 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66  ct stat conchInf
35280 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c  o;.      int goL
35290 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20  ockless = 0;..  
352a0 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 70      if( osStat(p
352b0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
352c0 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20  th, &conchInfo) 
352d0 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20  == -1 ) {.      
352e0 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
352f0 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  o;.        if( (
35300 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20  err==ENOENT) && 
35310 28 73 74 61 74 66 73 28 64 62 50 61 74 68 2c 20  (statfs(dbPath, 
35320 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20  &fsInfo) != -1) 
35330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c  ){.          goL
35340 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66  ockless = (fsInf
35350 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44  o.f_flags&MNT_RD
35360 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f  ONLY) == MNT_RDO
35370 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  NLY;.        }. 
35380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35390 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20   goLockless ){. 
353a0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e         pCtx->con
353b0 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20  chHeld = -1; /* 
353c0 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f  read only FS/ lo
353d0 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ckless */.      
353e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
353f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35400 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d    }  .  if( rc==
35410 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63  SQLITE_OK && loc
35420 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74  kPath ){.    pCt
35430 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35440 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
35450 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b  up(0, lockPath);
35460 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
35470 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35480 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
35490 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
354a0 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20  0, dbPath);.    
354b0 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68  if( pCtx->dbPath
354c0 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
354d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
354e0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  M;.    }.  }.  i
354f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35500 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d   ){.    /* all m
35510 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
35520 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63  ed, proxys are c
35530 72 65 61 74 65 64 20 61 6e 64 20 61 73 73 69 67  reated and assig
35540 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69  ned, .    ** swi
35550 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  tch the locking 
35560 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
35570 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e  hod then return.
35580 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78  .    */.    pCtx
35590 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
355a0 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ext = pFile->loc
355b0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
355c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
355d0 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20  ontext = pCtx;. 
355e0 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74     pCtx->pOldMet
355f0 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  hod = pFile->pMe
35600 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d  thod;.    pFile-
35610 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78  >pMethod = &prox
35620 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  yIoMethods;.  }e
35630 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74  lse{.    if( pCt
35640 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20  x->conchFile ){ 
35650 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e  .      pCtx->con
35660 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
35670 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
35680 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f  _file *)pCtx->co
35690 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  nchFile);.      
356a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
356b0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
356c0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
356d0 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e  DbFree(0, pCtx->
356e0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a  lockProxyPath);.
356f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
35700 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
35710 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69  Path); .    sqli
35720 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a  te3_free(pCtx);.
35730 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
35740 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25  TRANSPROXY  %d %
35750 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  s\n", pFile->h,.
35760 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d             (rc==
35770 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
35780 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a   : "failed")));.
35790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
357a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
357b0 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69  ine handles sqli
357c0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
357d0 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72  () calls that ar
357e0 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  e specific.** to
357f0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
35800 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
35810 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
35820 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
35830 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
35840 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
35850 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
35860 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
35870 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
35880 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
35890 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
358a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  ;.      if( pFil
358b0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
358c0 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b  roxyIoMethods ){
358d0 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f  .        proxyLo
358e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
358f0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
35900 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
35910 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
35920 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 54  ;.        proxyT
35930 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
35940 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
35950 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28   ){.          *(
35970 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
35980 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  rg = pCtx->lockP
35990 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
359a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
359b0 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
359c0 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f  **)pArg = ":auto
359d0 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20  : (not held)";. 
359e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
359f0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
35a00 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
35a10 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  pArg = NULL;.   
35a20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
35a30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
35a40 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
35a50 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
35a60 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
35a70 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
35a80 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
35a90 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
35aa0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
35ab0 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20  nt isProxyStyle 
35ac0 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  = (pFile->pMetho
35ad0 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  d == &proxyIoMet
35ae0 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28  hods);.      if(
35af0 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28   pArg==NULL || (
35b00 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72  const char *)pAr
35b10 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
35b20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65  if( isProxyStyle
35b30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
35b40 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
35b50 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75  locking - not su
35b60 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20  pported */.     
35b70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
35b80 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f  _ERROR /*SQLITE_
35b90 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45  PROTOCOL? SQLITE
35ba0 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20  _MISUSE?*/;.    
35bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35bc0 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66       /* turn off
35bd0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d   proxy locking -
35be0 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e   already off - N
35bf0 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  OOP */.         
35c00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35c10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35c30 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78  const char *prox
35c40 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63  yPath = (const c
35c50 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  har *)pArg;.    
35c60 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53      if( isProxyS
35c70 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tyle ){.        
35c80 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
35c90 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20  ntext *pCtx = . 
35ca0 20 20 20 20 20 20 20 20 20 20 20 28 70 72 6f 78             (prox
35cb0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
35cc0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
35cd0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
35ce0 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 70 41    if( !strcmp(pA
35cf0 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20  rg, ":auto:") . 
35d00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43            || (pC
35d10 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
35d20 68 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  h &&.           
35d30 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74      !strncmp(pCt
35d40 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35d50 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  , proxyPath, MAX
35d60 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20  PATHLEN)).      
35d70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
35d80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
35d90 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  K;.          }el
35da0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
35db0 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50  rc = switchLockP
35dc0 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20  roxyPath(pFile, 
35dd0 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
35de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35df0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35e00 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78   /* turn on prox
35e10 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a  y file locking *
35e20 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
35e30 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
35e40 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70  nixFile(pFile, p
35e50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20  roxyPath);.     
35e60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35e70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
35e80 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
35e90 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
35ea0 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61   0 );  /* The ca
35eb0 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61 74 20  ll assures that 
35ec0 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64  only valid opcod
35ed0 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20  es are sent */. 
35ee0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
35ef0 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75  REACHED*/.  retu
35f00 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
35f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e  .}../*.** Within
35f20 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28   this division (
35f30 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  the proxying loc
35f40 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
35f50 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75  ion) the procedu
35f60 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69  res.** above thi
35f70 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20  s point are all 
35f80 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20  utilities.  The 
35f90 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74  lock-related met
35fa0 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  hods of the.** p
35fb0 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c  roxy-locking sql
35fc0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f  ite3_io_method o
35fd0 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f  bject follow..*/
35fe0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
35ff0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
36000 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
36010 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
36020 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
36030 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
36040 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
36050 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
36060 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
36070 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
36080 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
36090 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
360a0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
360b0 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
360c0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
360d0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
360e0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
360f0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
36100 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
36110 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
36120 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
36130 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
36140 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
36150 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t) {.  unixFile 
36160 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
36170 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
36180 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
36190 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
361a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
361b0 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
361c0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
361d0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
361e0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
361f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
36200 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
36210 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
36220 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
36230 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
36240 6f 78 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72  oxy;.      retur
36250 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  n proxy->pMethod
36260 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  ->xCheckReserved
36270 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
36280 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f  le*)proxy, pResO
36290 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20  ut);.    }else{ 
362a0 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30  /* conchHeld < 0
362b0 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   is lockless */.
362c0 20 20 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b        pResOut=0;
362d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
362e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
362f0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
36300 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
36310 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
36320 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
36330 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
36340 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
36350 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
36360 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
36370 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
36380 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
36390 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
363a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
363b0 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
363c0 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
363d0 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
363e0 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
363f0 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
36400 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
36410 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
36420 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
36430 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
36440 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
36450 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
36460 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
36470 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
36480 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
36490 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
364a0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
364b0 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
364c0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
364d0 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
364e0 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
364f0 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
36500 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
36510 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
36520 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
36530 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
36540 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
36550 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
36560 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
36570 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
36580 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
36590 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
365a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
365b0 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
365c0 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
365d0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
365e0 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
365f0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
36600 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
36610 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
36620 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
36630 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
36640 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
36650 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
36660 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
36670 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
36680 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
36690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
366a0 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
366b0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
366c0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
366d0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
366e0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
366f0 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63  .    if( pCtx->c
36700 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
36710 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72      unixFile *pr
36720 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
36730 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20  Proxy;.      rc 
36740 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  = proxy->pMethod
36750 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
36760 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46  _file*)proxy, eF
36770 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  ileLock);.      
36780 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
36790 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c   = proxy->eFileL
367a0 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
367b0 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65        /* conchHe
367c0 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
367d0 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  ss */.    }.  }.
367e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
367f0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
36800 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
36810 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
36820 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
36830 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
36840 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
36850 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
36860 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
36870 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
36880 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
36890 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
368a0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
368b0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
368c0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
368d0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
368e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
368f0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
36900 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
36910 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
36920 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
36930 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
36940 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
36950 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
36960 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
36970 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36980 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
36990 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
369a0 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
369b0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
369c0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
369d0 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  xt;.    if( pCtx
369e0 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
369f0 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
36a00 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  *proxy = pCtx->l
36a10 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20  ockProxy;.      
36a20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74  rc = proxy->pMet
36a30 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
36a40 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78  lite3_file*)prox
36a50 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  y, eFileLock);. 
36a60 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
36a70 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65  eLock = proxy->e
36a80 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65  FileLock;.    }e
36a90 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f  lse{.      /* co
36aa0 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c  nchHeld < 0 is l
36ab0 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d  ockless */.    }
36ac0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
36ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
36ae0 20 61 20 66 69 6c 65 20 74 68 61 74 20 75 73 65   a file that use
36af0 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a  s proxy locks..*
36b00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
36b10 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
36b20 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
36b30 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
36b40 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
36b50 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
36b60 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
36b70 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
36b80 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
36b90 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
36ba0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75  ngContext;.    u
36bb0 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
36bc0 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
36bd0 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69  roxy;.    unixFi
36be0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
36bf0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
36c00 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
36c10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20  LITE_OK;.    .  
36c20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20    if( lockProxy 
36c30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
36c40 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
36c50 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
36c60 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f  e3_file*)lockPro
36c70 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  xy, NO_LOCK);.  
36c80 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36c90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
36ca0 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d   = lockProxy->pM
36cb0 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
36cc0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63  qlite3_file*)loc
36cd0 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69  kProxy);.      i
36ce0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36cf0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
36d00 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29  _free(lockProxy)
36d10 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f  ;.      pCtx->lo
36d20 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20  ckProxy = 0;.   
36d30 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68   }.    if( conch
36d40 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  File ){.      if
36d50 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
36d60 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  d ){.        rc 
36d70 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f  = proxyReleaseCo
36d80 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nch(pFile);.    
36d90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36da0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
36db0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
36dc0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
36dd0 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
36de0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b  ile*)conchFile);
36df0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
36e00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36e10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f   sqlite3_free(co
36e20 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  nchFile);.    }.
36e30 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
36e40 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  e(0, pCtx->lockP
36e50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73  roxyPath);.    s
36e60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
36e70 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
36e80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
36e90 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 64 62 50  ree(0, pCtx->dbP
36ea0 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73  ath);.    /* res
36eb0 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61  tore the origina
36ec0 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  l locking contex
36ed0 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68  t and pMethod th
36ee0 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20  en close it */. 
36ef0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
36f00 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d  gContext = pCtx-
36f10 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  >oldLockingConte
36f20 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  xt;.    pFile->p
36f30 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70  Method = pCtx->p
36f40 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73  OldMethod;.    s
36f50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
36f60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46  );.    return pF
36f70 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
36f80 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  lose(id);.  }.  
36f90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36fa0 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.}....#endif /*
36fb0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
36fc0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
36fd0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
36fe0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
36ff0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74  proxy locking st
37000 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  yle is intended 
37010 66 6f 72 20 75 73 65 20 77 69 74 68 20 41 46 50  for use with AFP
37020 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
37030 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69   And since AFP i
37040 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
37050 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20   on MacOSX, the 
37060 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
37070 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63   also.** restric
37080 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a  ted to MacOSX..*
37090 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  * .**.**********
370a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
370b0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
370c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
370d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
370e0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
370f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37130 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ****/../*.** Ini
37140 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
37150 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
37160 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erface..**.** Th
37170 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73  is routine regis
37180 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70  ters all VFS imp
37190 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
371a0 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61   unix-like opera
371b0 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e  ting.** systems.
371c0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20    This routine, 
371d0 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f  and the sqlite3_
371e0 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  os_end() routine
371f0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a   that follows,.*
37200 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  * should be the 
37210 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e  only routines in
37220 20 74 68 69 73 20 66 69 6c 65 20 74 68 61 74 20   this file that 
37230 61 72 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d  are visible from
37240 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e   other.** files.
37250 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
37260 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
37270 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ce during SQLite
37280 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
37290 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67  and by a.** sing
372a0 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20  le thread.  The 
372b0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
372c0 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73  n and mutex subs
372d0 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a  ystems have not.
372e0 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62  ** necessarily b
372f0 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
37300 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
37310 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64  e is called, and
37320 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75   so they.** shou
37330 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a  ld not be used..
37340 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
37350 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20  s_init(void){ . 
37360 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f   /* .  ** The fo
37370 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65  llowing macro de
37380 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c  fines an initial
37390 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69  izer for an sqli
373a0 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
373b0 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66    ** The name of
373c0 20 74 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45   the VFS is NAME
373d0 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 20  .  The pAppData 
373e0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
373f0 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74  a pointer.  ** t
37400 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22 20 66  o the "finder" f
37410 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44  unction.  (pAppD
37420 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ata is a pointer
37430 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65   to a pointer be
37440 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79  cause.  ** silly
37450 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69   C90 rules prohi
37460 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d  bit a void* from
37470 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61   being cast to a
37480 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
37490 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65  r.  ** and so we
374a0 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f   have to go thro
374b0 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64  ugh the intermed
374c0 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  iate pointer to 
374d0 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20  avoid problems. 
374e0 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
374f0 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  ng with -pedanti
37500 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e  c-errors on GCC.
37510 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
37520 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72  FINDER parameter
37530 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69   to this macro i
37540 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
37550 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
37560 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e  .  ** finder-fun
37570 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64  ction.  The find
37580 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  er-function retu
37590 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
375a0 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
375b0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
375c0 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
375d0 74 73 20 74 68 65 20 64 65 73 69 72 65 64 20 6c  ts the desired l
375e0 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61  ocking.  ** beha
375f0 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20  viors.  See the 
37600 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74  division above t
37610 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
37620 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20   IOMETHODS.  ** 
37630 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69  macro for additi
37640 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  on information o
37650 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  n finder-functio
37660 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ns..  **.  ** Mo
37670 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c  st finders simpl
37680 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  y return a point
37690 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
376a0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
376b0 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42  .  ** object.  B
376c0 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b  ut the "autolock
376d0 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61  IoFinder" availa
376e0 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f  ble on MacOSX do
376f0 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a  es a little.  **
37700 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b   more than that;
37710 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65   it looks at the
37720 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
37730 20 74 68 61 74 20 68 6f 73 74 73 20 74 68 65 20   that hosts the 
37740 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
37750 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ile and tries to
37760 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69   choose an locki
37770 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70  ng method approp
37780 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74  riate for.  ** t
37790 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74  hat filesystem t
377a0 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66  ime..  */.  #def
377b0 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e  ine UNIXVFS(VFSN
377c0 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20  AME, FINDER) {  
377d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
377e0 20 20 20 20 20 20 5c 0a 20 20 20 20 33 2c 20 20        \.    3,  
377f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37800 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
37810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37820 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66      \.    sizeof
37830 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20  (unixFile),     
37840 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20  /* szOsFile */  
37850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37860 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48    \.    MAX_PATH
37870 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a  NAME,         /*
37880 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20   mxPathname */  
37890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378a0 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  \.    0,        
378b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
378c0 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20  Next */         
378d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
378e0 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20      VFSNAME,    
378f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
37900 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
37910 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37920 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52    (void*)&FINDER
37930 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44  ,       /* pAppD
37940 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ata */          
37950 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
37960 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20  unixOpen,       
37970 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
37980 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37990 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
379a0 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  ixDelete,       
379b0 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
379c0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
379d0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
379e0 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
379f0 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20    /* xAccess */ 
37a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a10 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75      \.    unixFu
37a20 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
37a30 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
37a40 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37a50 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70    \.    unixDlOp
37a60 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
37a70 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20   xDlOpen */     
37a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a90 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f  \.    unixDlErro
37aa0 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
37ab0 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  DlError */      
37ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37ad0 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20      unixDlSym,  
37ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
37af0 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Sym */          
37b00 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37b10 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20    unixDlClose,  
37b20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
37b30 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
37b40 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
37b50 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20  unixRandomness, 
37b60 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
37b70 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ness */         
37b80 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
37b90 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  ixSleep,        
37ba0 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
37bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37bc0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37bd0 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
37be0 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
37bf0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
37c00 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65      \.    unixGe
37c10 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
37c20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
37c30 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37c40 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72    \.    unixCurr
37c50 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
37c60 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
37c70 36 34 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  64 */           
37c80 5c 0a 20 20 20 20 75 6e 69 78 53 65 74 53 79 73  \.    unixSetSys
37c90 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
37ca0 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
37cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37cc0 20 20 20 20 75 6e 69 78 47 65 74 53 79 73 74 65      unixGetSyste
37cd0 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
37ce0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20  tSystemCall */  
37cf0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37d00 20 20 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d    unixNextSystem
37d10 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
37d20 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20  SystemCall */   
37d30 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
37d40 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64  .  /*.  ** All d
37d50 65 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72  efault VFSes for
37d60 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69   unix are contai
37d70 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ned in the follo
37d80 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a  wing array..  **
37d90 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
37da0 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  the sqlite3_vfs.
37db0 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74  pNext field of t
37dc0 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73  he VFS object is
37dd0 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62   modified.  ** b
37de0 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  y the SQLite cor
37df0 65 20 77 68 65 6e 20 74 68 65 20 56 46 53 20 69  e when the VFS i
37e00 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 20 53  s registered.  S
37e10 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
37e20 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f    ** array canno
37e30 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f  t be const..  */
37e40 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
37e50 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b  3_vfs aVfs[] = {
37e60 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
37e70 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
37e80 20 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20   && (OS_VXWORKS 
37e90 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
37ea0 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56  LE__)).    UNIXV
37eb0 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
37ec0 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69      autolockIoFi
37ed0 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20  nder ),.#else.  
37ee0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
37ef0 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 78  ,          posix
37f00 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
37f10 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  if.    UNIXVFS("
37f20 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20  unix-none",     
37f30 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  nolockIoFinder )
37f40 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
37f50 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64  nix-dotfile",  d
37f60 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  otlockIoFinder )
37f70 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
37f80 6e 69 78 2d 65 78 63 6c 22 2c 20 20 20 20 20 70  nix-excl",     p
37f90 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
37fa0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
37fb0 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
37fc0 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49  -namedsem", semI
37fd0 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
37fe0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
37ff0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
38000 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  E.    UNIXVFS("u
38010 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70  nix-posix",    p
38020 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
38030 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
38040 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
38050 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f  x-flock",    flo
38060 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
38070 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndif.#endif.#if 
38080 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
38090 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
380a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
380b0 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ).    UNIXVFS("u
380c0 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61  nix-afp",      a
380d0 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  fpIoFinder ),.  
380e0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
380f0 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73 49 6f  nfs",      nfsIo
38100 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
38110 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78  IXVFS("unix-prox
38120 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69  y",    proxyIoFi
38130 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
38140 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
38150 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
38160 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
38170 2f 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63  /..  /* Double-c
38180 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53  heck that the aS
38190 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68  yscall[] array h
381a0 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  as been construc
381b0 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74  ted.  ** correct
381c0 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  ly.  See ticket 
381d0 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36  [bb3a86e890c8e96
381e0 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ab] */.  assert(
381f0 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63   ArraySize(aSysc
38200 61 6c 6c 29 3d 3d 31 36 20 29 3b 0a 0a 20 20 2f  all)==16 );..  /
38210 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 56  * Register all V
38220 46 53 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20  FSes defined in 
38230 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72 61 79  the aVfs[] array
38240 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
38250 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73  <(sizeof(aVfs)/s
38260 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66  izeof(sqlite3_vf
38270 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  s)); i++){.    s
38280 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
38290 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d  ter(&aVfs[i], i=
382a0 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  =0);.  }.  retur
382b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
382c0 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
382d0 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
382e0 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
382f0 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61  **.** Some opera
38300 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d 69 67  ting systems mig
38310 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f  ht need to do so
38320 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20 74 68  me cleanup in th
38330 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74  is routine,.** t
38340 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61 6d 69  o release dynami
38350 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
38360 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20 6e 6f  objects.  But no
38370 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68  t on unix..** Th
38380 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
38390 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a  no-op for unix..
383a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
383b0 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20  s_end(void){ .  
383c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
383d0 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a  ; .}. .#endif /*
383e0 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
383f0 2a 2f 0a                                         */.