/ Hex Artifact Content
Login

Artifact 10e0c4dcdbec8d4189890fdf3e71b32efae194e3:


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 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1af0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b10: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b20: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b40: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b50: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b60: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b70: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1b80: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bb0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1bc0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bd0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1be0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1bf0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c00: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c10: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c20: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c40: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c50: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c70: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1c80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1c90: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1ca0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cd0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1ce0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1cf0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d20: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d30: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d40: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d50: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d60: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d80: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1d90: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1da0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1db0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dc0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1dd0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1de0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e10: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e20: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e30: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e40: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e70: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1e80: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1e90: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ea0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1eb0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ec0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ed0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1ee0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1ef0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f00: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f10: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f20: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f30: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f50: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f60: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f70: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1f80: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1f90: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fa0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fb0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fc0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1fd0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1fe0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1ff0: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2000: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2010: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2020: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2030: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2040: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2050: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2060: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2070: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2080: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20a0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20b0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20c0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20d0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
20e0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
20f0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2100: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2110: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2120: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2130: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2140: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2160: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2170: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2180: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
2190: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21a0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21b0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21c0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21d0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
21e0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
21f0: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2200: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2210: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2220: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2230: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2240: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2250: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20  NIXFILE_EXCL    
2260: 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20      0x01     /* 
2270: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
2280: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
2290: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
22a0: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  XFILE_RDONLY    
22b0: 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f    0x02     /* Co
22c0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64  nnection is read
22d0: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
22e0: 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
22f0: 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f  T_WAL 0x04     /
2300: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
2310: 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66   mode */.#ifndef
2320: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2330: 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  DIRSYNC.# define
2340: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2350: 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a  C    0x08     /*
2360: 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   Directory sync 
2370: 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a  needed */.#else.
2380: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2390: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
23a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
23b0: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
23c0: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
23d0: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
23e0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
23f0: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
2400: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
2410: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
2420: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
2430: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
2440: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
2450: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
2460: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
2470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
2480: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
2490: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
24a0: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
24b0: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
24c0: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
24d0: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
24e0: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
24f0: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
2500: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
2510: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2520: 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72  he threadid macr
2530: 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68  o resolves to th
2540: 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74  e thread-id or t
2550: 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a  o 0.  Used for.*
2560: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
2570: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2580: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
2590: 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74  ADSAFE.#define t
25a0: 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f  hreadid pthread_
25b0: 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65  self().#else.#de
25c0: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a  fine threadid 0.
25d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69  #endif../*.** Di
25e0: 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73  fferent Unix sys
25f0: 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65  tems declare ope
2600: 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74  n() in different
2610: 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65   ways.  Same use
2620: 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63  .** open(const c
2630: 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29  har*,int,mode_t)
2640: 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70  .  Others use op
2650: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  en(const char*,i
2660: 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20  nt,...)..** The 
2670: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d  difference is im
2680: 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69  portant when usi
2690: 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
26a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  the function..**
26b0: 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77  .** The safest w
26c0: 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ay to deal with 
26d0: 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
26e0: 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69  o always use thi
26f0: 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69  s wrapper.** whi
2700: 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68  ch always has th
2710: 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69  e same well-defi
2720: 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ned interface..*
2730: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
2740: 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  ixOpen(const cha
2750: 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c  r *zFile, int fl
2760: 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a  ags, int mode){.
2770: 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46    return open(zF
2780: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65  ile, flags, mode
2790: 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  );.}../* Forward
27a0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
27b0: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
27c0: 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
27d0: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a  r*, int*);../*.*
27e0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
27f0: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2800: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2810: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2820: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2830: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2840: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2850: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2860: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2870: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2880: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2890: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
28a0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
28b0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
28c0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
28d0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
28e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
28f0: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2900: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2910: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2920: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2930: 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20   sytem call */. 
2940: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2950: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
2960: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
2970: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2980: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2990: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
29a0: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
29b0: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
29c0: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
29d0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
29e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
29f0: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
2a00: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2a10: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
2a20: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
2a30: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
2a40: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
2a50: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
2a60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2a70: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
2a80: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2a90: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
2aa0: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
2ab0: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
2ac0: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
2ad0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2ae0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
2af0: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
2b00: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
2b10: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2b20: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
2b30: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
2b40: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
2b50: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2b60: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
2b70: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
2b80: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
2b90: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
2ba0: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
2bb0: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2bc0: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
2bd0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2be0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
2bf0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
2c00: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
2c10: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2c20: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
2c30: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
2c40: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
2c50: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
2c60: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
2c70: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
2c80: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
2c90: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
2ca0: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
2cb0: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
2cc0: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
2cd0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
2ce0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
2cf0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
2d00: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
2d10: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
2d20: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
2d30: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
2d40: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
2d50: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
2d60: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
2d70: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
2d80: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
2d90: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
2da0: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
2db0: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
2dc0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2dd0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
2de0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
2df0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
2e00: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2e10: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
2e20: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
2e30: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
2e40: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
2e50: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2e60: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
2e70: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2e80: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
2e90: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
2ea0: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
2eb0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
2ec0: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
2ed0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2ee0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
2ef0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
2f00: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
2f10: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
2f20: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
2f30: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
2f40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2f50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
2f60: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
2f70: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
2f80: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
2f90: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
2fa0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
2fb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2fc0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
2fd0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2fe0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2ff0: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
3000: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3010: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
3020: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3030: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3040: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3050: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3060: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3070: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3080: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3090: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
30a0: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
30b0: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
30c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
30d0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
30e0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
30f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3100: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
3110: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3120: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3130: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3140: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3150: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3160: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20  fine osPread64  
3170: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3180: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3190: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
31a0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
31b0: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
31c0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
31d0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
31e0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
31f0: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
3200: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3210: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3220: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3230: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3240: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3250: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3260: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3270: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3280: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3290: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
32a0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
32b0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
32c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
32d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
32e0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
32f0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3300: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
3310: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3320: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3330: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3340: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3350: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3360: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3370: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3380: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3390: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
33a0: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
33b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
33c0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
33d0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
33e0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
33f0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3400: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3410: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3420: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3430: 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20  e_t,off_t))\.   
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43   aSyscall[13].pC
3460: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3470: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3480: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63  NG_STYLE.  { "fc
3490: 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71  hmod",       (sq
34a0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
34b0: 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20  r)fchmod,     0 
34c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
34d0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
34e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
34f0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3500: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3510: 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20  ine osFchmod    
3520: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64  ((int(*)(int,mod
3530: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  e_t))aSyscall[14
3540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3550: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
3560: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
3570: 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
3580: 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c  LOCATE.  { "fall
3590: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
35a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35b0: 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c  posix_fallocate,
35c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
35d0: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
35e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
35f0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3600: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3610: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61  dif.#define osFa
3620: 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29  llocate ((int(*)
3630: 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74  (int,off_t,off_t
3640: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3650: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75  Current)..  { "u
3660: 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73  nlink",       (s
3670: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3680: 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20  tr)unlink,      
3690: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
36a0: 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28  e osUnlink    ((
36b0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
36c0: 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  r*))aSyscall[16]
36d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
36e0: 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c  "openDirectory",
36f0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3700: 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72  call_ptr)openDir
3710: 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d  ectory,      0 }
3720: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
3730: 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28  Directory ((int(
3740: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3750: 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37  nt*))aSyscall[17
3760: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20  ].pCurrent)..}; 
3770: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
3780: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
3790: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a  m calls */../*.*
37a0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53  * This is the xS
37b0: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d  etSystemCall() m
37c0: 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33  ethod of sqlite3
37d0: 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  _vfs for all of 
37e0: 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46  the.** "unix" VF
37f0: 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Ses.  Return SQL
3800: 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63  ITE_OK opon succ
3810: 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e  essfully updatin
3820: 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20  g the.** system 
3830: 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72  call pointer, or
3840: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
3850: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
3860: 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20  configurable.** 
3870: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
3880: 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
3890: 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79  ic int unixSetSy
38a0: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
38b0: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
38c0: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d,        /* The
38d0: 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e   VFS pointer.  N
38e0: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
38f0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
3900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3910: 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c  me of system cal
3920: 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f  l to override */
3930: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
3940: 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20  ll_ptr pNewFunc 
3950: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
3960: 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76  ew system call v
3970: 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  alue */.){.  uns
3980: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
3990: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
39a0: 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53  OTFOUND;..  UNUS
39b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
39c0: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e  tUsed);.  if( zN
39d0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
39e0: 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20   If no zName is 
39f0: 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61  given, restore a
3a00: 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ll system calls 
3a10: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
3a20: 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  .    ** settings
3a30: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3a40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
3a50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
3a60: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
3a70: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
3a80: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
3a90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
3aa0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3ab0: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
3ac0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
3ad0: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
3ae0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
3af0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
3b00: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  lse{.    /* If z
3b10: 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  Name is specifie
3b20: 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e  d, operate on on
3b30: 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65  ly the one syste
3b40: 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70  m call.    ** sp
3b50: 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
3b60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
3b70: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
3b80: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
3b90: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
3ba0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
3bb0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
3bc0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
3bd0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
3be0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20  [i].pDefault==0 
3bf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79  ){.          aSy
3c00: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
3c10: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
3c20: 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20  pCurrent;.      
3c30: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
3c40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
3c50: 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63      if( pNewFunc
3c60: 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d  ==0 ) pNewFunc =
3c70: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3c80: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61  fault;.        a
3c90: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
3ca0: 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a  ent = pNewFunc;.
3cb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3cc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3cd0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3ce0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3cf0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73  e value of a sys
3d00: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
3d10: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20  n NULL if zName 
3d20: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f  is not a.** reco
3d30: 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61  gnized system ca
3d40: 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69  ll name.  NULL i
3d50: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
3d60: 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  if the system ca
3d70: 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ll.** is current
3d80: 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  ly undefined..*/
3d90: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
3da0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78  syscall_ptr unix
3db0: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
3dc0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
3dd0: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
3de0: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
3df0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
3e00: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
3e10: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
3e20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
3e30: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
3e40: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
3e50: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
3e60: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
3e70: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
3e80: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
3e90: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
3ea0: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
3eb0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
3ec0: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
3ed0: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
3ee0: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
3ef0: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
3f00: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
3f10: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
3f20: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
3f30: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
3f40: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
3f50: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
3f60: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
3f70: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
3f80: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
3f90: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
3fa0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3fb0: 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65  r *unixNextSyste
3fc0: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
3fd0: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
3fe0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
3ff0: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
4000: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
4010: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
4020: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
4030: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
4040: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
4050: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
4060: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
4070: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
4080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
4090: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
40a0: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
40b0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
40c0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
40d0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
40e0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
40f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4100: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 6f  }../*.** Retry o
4110: 70 65 6e 28 29 20 63 61 6c 6c 73 20 74 68 61 74  pen() calls that
4120: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
4130: 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  TR.*/.static int
4140: 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e   robust_open(con
4150: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
4160: 66 2c 20 69 6e 74 20 6d 29 7b 0a 20 20 69 6e 74  f, int m){.  int
4170: 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
4180: 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20 7d  osOpen(z,f,m); }
4190: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
41a0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
41b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
41c0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
41d0: 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
41e0: 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
41f0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
4200: 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
4210: 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
4220: 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78  protect the unix
4230: 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a  InodeInfo and.**
4240: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
4250: 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74  bjects used by t
4260: 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66  his file, all of
4270: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
4280: 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  * shared by mult
4290: 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
42a0: 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69  .** Function uni
42b0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
42c0: 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29  used to assert()
42d0: 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c   that the global
42e0: 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65   mutex .** is he
42f0: 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64  ld when required
4300: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
4310: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
4320: 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29  part of assert()
4330: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e   .** statements.
4340: 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e   e.g..**.**   un
4350: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a  ixEnterMutex().*
4360: 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e  *     assert( un
4370: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
4380: 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c  .**   unixEnterL
4390: 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63  eave().*/.static
43a0: 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d   void unixEnterM
43b0: 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
43c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
43d0: 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  r(sqlite3MutexAl
43e0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
43f0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
4400: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
4410: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76  unixLeaveMutex(v
4420: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
4430: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
4440: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
4450: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
4460: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69  C_MASTER));.}.#i
4470: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4480: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
4490: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
44a0: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
44b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
44c0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
44d0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
44e0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
44f0: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66  .#endif...#ifdef
4500: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
4510: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
4520: 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  ion for printing
4530: 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72   out trace infor
4540: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75  mation from debu
4550: 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65  gging.** binarie
4560: 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20  s. This returns 
4570: 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
4580: 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  setation of the 
4590: 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65  supplied.** inte
45a0: 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a  ger lock-type..*
45b0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
45c0: 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28  har *azFileLock(
45d0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
45e0: 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c    switch( eFileL
45f0: 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ock ){.    case 
4600: 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NO_LOCK: return 
4610: 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65  "NONE";.    case
4620: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65   SHARED_LOCK: re
4630: 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20  turn "SHARED";. 
4640: 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44     case RESERVED
4650: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52  _LOCK: return "R
4660: 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61  ESERVED";.    ca
4670: 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a  se PENDING_LOCK:
4680: 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47   return "PENDING
4690: 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c  ";.    case EXCL
46a0: 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75  USIVE_LOCK: retu
46b0: 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a  rn "EXCLUSIVE";.
46c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52    }.  return "ER
46d0: 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ROR";.}.#endif..
46e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  #ifdef SQLITE_LO
46f0: 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50  CK_TRACE./*.** P
4700: 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61  rint out informa
4710: 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c  tion about all l
4720: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
4730: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
4740: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
4750: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
4760: 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69  g locks on multi
4770: 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74  threaded.** plat
4780: 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62  forms.  Enable b
4790: 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68  y compiling with
47a0: 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f   the -DSQLITE_LO
47b0: 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d  CK_TRACE.** comm
47c0: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
47d0: 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  on the compiler.
47e0: 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e    This code is n
47f0: 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65  ormally.** turne
4800: 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  d off..*/.static
4810: 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69   int lockTrace(i
4820: 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73  nt fd, int op, s
4830: 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b  truct flock *p){
4840: 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  .  char *zOpName
4850: 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20  , *zType;.  int 
4860: 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72  s;.  int savedEr
4870: 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46  rno;.  if( op==F
4880: 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _GETLK ){.    zO
4890: 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b  pName = "GETLK";
48a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
48b0: 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_SETLK ){.    
48c0: 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b  zOpName = "SETLK
48d0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
48e0: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  s = osFcntl(fd, 
48f0: 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  op, p);.    sqli
4900: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4910: 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64  fcntl unknown %d
4920: 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f   %d %d\n", fd, o
4930: 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72  p, s);.    retur
4940: 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n s;.  }.  if( p
4950: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
4960: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
4970: 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "RDLCK";.  }els
4980: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
4990: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
49a0: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
49b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
49c0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
49d0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
49e0: 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  UNLCK";.  }else{
49f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29  .    assert( 0 )
4a00: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4a10: 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45  p->l_whence==SEE
4a20: 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f  K_SET );.  s = o
4a30: 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70  sFcntl(fd, op, p
4a40: 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20  );.  savedErrno 
4a50: 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74  = errno;.  sqlit
4a60: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
4a70: 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73  cntl %d %d %s %s
4a80: 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %d %d %d %d\n",
4a90: 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20  .     threadid, 
4aa0: 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79  fd, zOpName, zTy
4ab0: 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74  pe, (int)p->l_st
4ac0: 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c  art, (int)p->l_l
4ad0: 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d  en,.     (int)p-
4ae0: 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66  >l_pid, s);.  if
4af0: 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d  ( s==(-1) && op=
4b00: 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e  =F_SETLK && (p->
4b10: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
4b20: 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  || p->l_type==F_
4b30: 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74  WRLCK) ){.    st
4b40: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20  ruct flock l2;. 
4b50: 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20     l2 = *p;.    
4b60: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
4b70: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
4b80: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
4b90: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
4ba0: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
4bb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
4bc0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
4bd0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
4be0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
4bf0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
4c00: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
4c10: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
4c20: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
4c30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
4c40: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
4c50: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4c60: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
4c70: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
4c80: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
4c90: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
4ca0: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
4cb0: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
4cc0: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
4cd0: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
4ce0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75    return s;.}.#u
4cf0: 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65  ndef osFcntl.#de
4d00: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63  fine osFcntl loc
4d10: 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a  kTrace.#endif /*
4d20: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41   SQLITE_LOCK_TRA
4d30: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CE */../*.** Ret
4d40: 72 79 20 66 74 72 75 6e 63 61 74 65 28 29 20 63  ry ftruncate() c
4d50: 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64  alls that fail d
4d60: 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73  ue to EINTR.*/.s
4d70: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4d80: 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68  _ftruncate(int h
4d90: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
4da0: 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  sz){.  int rc;. 
4db0: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75   do{ rc = osFtru
4dc0: 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68  ncate(h,sz); }wh
4dd0: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
4de0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72  no==EINTR );.  r
4df0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4e00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4e10: 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61  translates a sta
4e20: 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e  ndard POSIX errn
4e30: 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65  o code into some
4e40: 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20  thing.** useful 
4e50: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f  to the clients o
4e60: 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75  f the sqlite3 fu
4e70: 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66  nctions.  Specif
4e80: 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a  ically, it is.**
4e90: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61   intended to tra
4ea0: 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79  nslate a variety
4eb0: 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20   of "try again" 
4ec0: 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49  errors into SQLI
4ed0: 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61  TE_BUSY.** and a
4ee0: 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65   variety of "ple
4ef0: 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69  ase close the fi
4f00: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f  le descriptor NO
4f10: 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a  W" errors into .
4f20: 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  ** SQLITE_IOERR.
4f30: 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75  ** .** Errors du
4f40: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
4f50: 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72  ion of locks, or
4f60: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
4f70: 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a  port for locks,.
4f80: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65  ** should handle
4f90: 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50   ENOLCK, ENOTSUP
4fa0: 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70  , EOPNOTSUPP sep
4fb0: 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  arately..*/.stat
4fc0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72  ic int sqliteErr
4fd0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
4fe0: 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c  (int posixError,
4ff0: 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72   int sqliteIOErr
5000: 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f  ) {.  switch (po
5010: 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66 20  sixError) {.#if 
5020: 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f  0.  /* At one po
5030: 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77 61  int this code wa
5040: 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20  s not commented 
5050: 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20  out. In theory, 
5060: 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
5070: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
5080: 20 68 69 74 2c 20 61 73 20 74 68 69 73 20 66 75   hit, as this fu
5090: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e  nction should on
50a0: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
50b0: 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e  er.  ** a lockin
50c0: 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  g-related functi
50d0: 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29  on (i.e. fcntl()
50e0: 29 20 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e  ) has returned n
50f0: 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a  on-zero with.  *
5100: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  * the value of e
5110: 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72 73  rrno as the firs
5120: 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63  t argument. Sinc
5130: 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  e a system call 
5140: 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a  has failed,.  **
5150: 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65   errno should be
5160: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a   non-zero..  **.
5170: 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68 69    ** Despite thi
5180: 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61 6c  s, if errno real
5190: 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20 73  ly is zero, we s
51a0: 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20  till don't want 
51b0: 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  to return.  ** S
51c0: 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79  QLITE_OK. The sy
51d0: 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64  stem call failed
51e0: 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c  , and *some* SQL
51f0: 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c 64  ite error should
5200: 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61   be.  ** propaga
5210: 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ted back to the 
5220: 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69  caller. Commenti
5230: 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68 20 6f  ng this branch o
5240: 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d  ut means errno==
5250: 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68  0.  ** will be h
5260: 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22 64  andled by the "d
5270: 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62 65  efault:" case be
5280: 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  low..  */.  case
5290: 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20   0: .    return 
52a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
52b0: 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e  f..  case EAGAIN
52c0: 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f  :.  case ETIMEDO
52d0: 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59  UT:.  case EBUSY
52e0: 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a  :.  case EINTR:.
52f0: 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20    case ENOLCK:  
5300: 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e  .    /* random N
5310: 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20  FS retry error, 
5320: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
5330: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
5340: 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73  t .     * intros
5350: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
5360: 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  h it actually me
5370: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
5380: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
5390: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
53a0: 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20  .  case EACCES: 
53b0: 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69  .    /* EACCES i
53c0: 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75  s like EAGAIN du
53d0: 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65  ring locking ope
53e0: 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74  rations, but not
53f0: 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a   any other time*
5400: 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74  /.    if( (sqlit
5410: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
5420: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20  _IOERR_LOCK) || 
5430: 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ..(sqliteIOErr =
5440: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
5450: 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c  NLOCK) || ..(sql
5460: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
5470: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
5480: 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45 72   ||..(sqliteIOEr
5490: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
54a0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
54b0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  OCK) ){.      re
54c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
54d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65  ;.    }.    /* e
54e0: 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  lse fall through
54f0: 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d   */.  case EPERM
5500: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
5510: 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a  LITE_PERM;.    .
5520: 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73 20    /* EDEADLK is 
5530: 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
5540: 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c   a call to fcntl
5550: 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d 61  (F_SETLKW) is ma
5560: 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69  de. And.  ** thi
5570: 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d  s module never m
5580: 61 6b 65 73 20 73 75 63 68 20 61 20 63 61 6c 6c  akes such a call
5590: 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65 20 69  . And the code i
55a0: 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c 66 20  n SQLite itself 
55b0: 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20 74 68  .  ** asserts th
55c0: 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  at SQLITE_IOERR_
55d0: 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76 65 72  BLOCKED is never
55e0: 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72 20 74   returned. For t
55f0: 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a  hese reasons.  *
5600: 2a 20 74 68 69 73 20 63 61 73 65 20 69 73 20 61  * this case is a
5610: 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  lso commented ou
5620: 74 2e 20 49 66 20 74 68 65 20 73 79 73 74 65 6d  t. If the system
5630: 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e 6f 20   does set errno 
5640: 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a  to EDEADLK,.  **
5650: 20 74 68 65 20 64 65 66 61 75 6c 74 20 53 51 4c   the default SQL
5660: 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f  ITE_IOERR_XXX co
5670: 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  de will be retur
5680: 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ned. */.#if 0.  
5690: 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20  case EDEADLK:.  
56a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
56b0: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23  IOERR_BLOCKED;.#
56c0: 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 20 45  endif.    .#if E
56d0: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
56e0: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
56f0: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
5700: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
5710: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
5720: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
5730: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
5740: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
5750: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
5760: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
5770: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
5780: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
5790: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
57a0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
57b0: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
57c0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
57d0: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
57e0: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
57f0: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
5800: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
5810: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
5820: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
5830: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
5840: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
5850: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
5860: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
5870: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
5880: 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65  se ENOENT:.#ifde
5890: 66 20 45 53 54 41 4c 45 20 20 20 20 20 20 20 20  f ESTALE        
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
58b0: 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20 64 65  ESTALE is not de
58c0: 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69 78  fined on Interix
58d0: 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61   systems */.  ca
58e0: 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69  se ESTALE:.#endi
58f0: 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a  f.  case ENOSYS:
5900: 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68  .    /* these sh
5910: 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63  ould force the c
5920: 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74  lient to close t
5930: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f  he file and reco
5940: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20  nnect */.    .  
5950: 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65  default: .    re
5960: 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72  turn sqliteIOErr
5970: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a  ;.  }.}..../****
5980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
59d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
59e0: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
59f0: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
5a00: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
5a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
5a20: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
5a30: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
5a40: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
5a50: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
5a60: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
5a70: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
5a80: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
5a90: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
5aa0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
5ab0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
5ac0: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
5ad0: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
5ae0: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
5af0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
5b00: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
5b10: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
5b20: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
5b30: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
5b40: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
5b50: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
5b60: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
5b70: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
5b80: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
5b90: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
5ba0: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
5bb0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
5bc0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
5bd0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
5be0: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
5bf0: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
5c00: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
5c10: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
5c20: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
5c30: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
5c40: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
5c50: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
5c60: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
5c70: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
5c80: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
5c90: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
5ca0: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
5cb0: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
5cc0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
5cd0: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
5ce0: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
5cf0: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
5d00: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
5d10: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
5d20: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
5d30: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
5d40: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
5d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5d60: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
5d70: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
5d80: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5da0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
5db0: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
5dc0: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
5dd0: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
5de0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
5df0: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
5e00: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
5e10: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
5e20: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
5e30: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
5e40: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
5e50: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
5e60: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
5e70: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
5e80: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
5e90: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
5ea0: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
5eb0: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
5ec0: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
5ed0: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
5ee0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
5ef0: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
5f00: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
5f10: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
5f20: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
5f30: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
5f40: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
5f50: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
5f60: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
5f70: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
5f80: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
5f90: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
5fa0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
5fb0: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
5fc0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
5fd0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
5fe0: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
5ff0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
6000: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
6010: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
6020: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
6030: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
6040: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
6050: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
6060: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
6070: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
6080: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
6090: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
60a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
60b0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
60c0: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
60d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
60e0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
60f0: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
6100: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
6110: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
6120: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6140: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
6150: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
6160: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
6170: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
6180: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
6190: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
61a0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
61b0: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
61c0: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
61d0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
61e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
61f0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
6200: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
6210: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
6220: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
6230: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
6240: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
6250: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
6260: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
6270: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
6280: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
6290: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
62a0: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
62b0: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
62c0: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
62d0: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
62e0: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
62f0: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
6300: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
6310: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
6320: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
6330: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
6340: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
6350: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
6360: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
6370: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
6380: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
6390: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
63a0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
63b0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
63c0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
63d0: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
63e0: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
63f0: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
6400: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
6410: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
6420: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
6430: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
6440: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6450: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
6460: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
6470: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
6480: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
6490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
64b0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
64c0: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
64d0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
64e0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
64f0: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
6500: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
6510: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
6520: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
6530: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
6540: 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66   + (n+1) );.  if
6550: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
6560: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43  rn 0;.  pNew->zC
6570: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28  anonicalName = (
6580: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
6590: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
65a0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a  CanonicalName, z
65b0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b  AbsoluteName, n+
65c0: 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b  1);.  n = vxwork
65d0: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e  sSimplifyName(pN
65e0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
65f0: 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65  me, n);..  /* Se
6600: 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
6610: 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20  ting entry that 
6620: 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e  matching the can
6630: 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a  onical name..  *
6640: 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72  * If found, incr
6650: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
6660: 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65  nce count and re
6670: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6680: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74  o.  ** the exist
6690: 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a  ing file ID..  *
66a0: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
66b0: 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e  ex();.  for(pCan
66c0: 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69  didate=vxworksFi
66d0: 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61  leList; pCandida
66e0: 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70  te; pCandidate=p
66f0: 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74  Candidate->pNext
6700: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64  ){.    if( pCand
6710: 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20  idate->nName==n 
6720: 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28  .     && memcmp(
6730: 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e  pCandidate->zCan
6740: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77  onicalName, pNew
6750: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
6760: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  , n)==0.    ){. 
6770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6780: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
6790: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65   pCandidate->nRe
67a0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78  f++;.       unix
67b0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
67c0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e       return pCan
67d0: 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  didate;.    }.  
67e0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68  }..  /* No match
67f0: 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20   was found.  We 
6800: 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20  will make a new 
6810: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65  file ID */.  pNe
6820: 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  w->nRef = 1;.  p
6830: 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a  New->nName = n;.
6840: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
6850: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
6860: 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  .  vxworksFileLi
6870: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69  st = pNew;.  uni
6880: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
6890: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
68a0: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
68b0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
68c0: 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b  ount on a vxwork
68d0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
68e0: 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a   Free.** the obj
68f0: 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66  ect when the ref
6900: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
6910: 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  ches zero..*/.st
6920: 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b  atic void vxwork
6930: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73  sReleaseFileId(s
6940: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
6950: 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69  eId *pId){.  uni
6960: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
6970: 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52   assert( pId->nR
6980: 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e  ef>0 );.  pId->n
6990: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64  Ref--;.  if( pId
69a0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
69b0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
69c0: 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20  ileId **pp;.    
69d0: 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46  for(pp=&vxworksF
69e0: 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20  ileList; *pp && 
69f0: 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26  *pp!=pId; pp = &
6a00: 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b  ((*pp)->pNext)){
6a10: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  }.    assert( *p
6a20: 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70  p==pId );.    *p
6a30: 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a  p = pId->pNext;.
6a40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6a50: 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  (pId);.  }.  uni
6a60: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
6a70: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
6a80: 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  WORKS */./******
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
6aa0: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
6ab0: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
6ac0: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
6ad0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
6ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b20: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
6b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
6b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b90: 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76  ****** Posix Adv
6ba0: 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  isory Locking **
6bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
6bd0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
6be0: 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e  locks are broken
6bf0: 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53   by design.  ANS
6c00: 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39  I STD 1003.1 (19
6c10: 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36  96).** section 6
6c20: 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33  .5.2.2 lines 483
6c30: 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65   through 490 spe
6c40: 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61  cify that when a
6c50: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73   process.** sets
6c60: 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63   or clears a loc
6c70: 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f  k, that operatio
6c80: 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  n overrides any 
6c90: 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a  prior locks set.
6ca0: 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ** by the same p
6cb0: 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73  rocess.  It does
6cc0: 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20   not explicitly 
6cd0: 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73  say so, but this
6ce0: 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74   implies.** that
6cf0: 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f   it overrides lo
6d00: 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73  cks set by the s
6d10: 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e  ame process usin
6d20: 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  g a different.**
6d30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6d40: 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73  .  Consider this
6d50: 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a   test case:.**.*
6d60: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20  *       int fd1 
6d70: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22  = open("./file1"
6d80: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
6d90: 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20  , 0644);.**     
6da0: 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e    int fd2 = open
6db0: 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44  ("./file2", O_RD
6dc0: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
6dd0: 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  );.**.** Suppose
6de0: 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66   ./file1 and ./f
6df0: 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20  ile2 are really 
6e00: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62  the same file (b
6e10: 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73  ecause.** one is
6e20: 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f   a hard or symbo
6e30: 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20  lic link to the 
6e40: 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79  other) then if y
6e50: 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63  ou set.** an exc
6e60: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66  lusive lock on f
6e70: 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  d1, then try to 
6e80: 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  get an exclusive
6e90: 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c   lock.** on fd2,
6ea0: 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f   it works.  I wo
6eb0: 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65  uld have expecte
6ec0: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63  d the second loc
6ed0: 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e  k to.** fail sin
6ee0: 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72  ce there was alr
6ef0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  eady a lock on t
6f00: 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66  he file due to f
6f10: 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73  d1..** But not s
6f20: 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c  o.  Since both l
6f30: 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74  ocks came from t
6f40: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c  he same process,
6f50: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f   the.** second o
6f60: 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72  verrides the fir
6f70: 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  st, even though 
6f80: 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66  they were on dif
6f90: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
6fa0: 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65  escriptors opene
6fb0: 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66  d on different f
6fc0: 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a  ile names..**.**
6fd0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
6fe0: 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50   we cannot use P
6ff0: 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79  OSIX locks to sy
7000: 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61  nchronize file a
7010: 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63  ccess.** among c
7020: 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73  ompeting threads
7030: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f   of the same pro
7040: 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63  cess.  POSIX loc
7050: 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ks will work fin
7060: 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e  e.** to synchron
7070: 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74  ize access for t
7080: 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61  hreads in separa
7090: 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75  te processes, bu
70a0: 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  t not.** threads
70b0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
70c0: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
70d0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
70e0: 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69  he problem, SQLi
70f0: 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65  te has to manage
7100: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65   file locks inte
7110: 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73  rnally.** on its
7120: 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20   own.  Whenever 
7130: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
7140: 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76  s opened, we hav
7150: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  e to find the.**
7160: 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20   specific inode 
7170: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7180: 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20  file (the inode 
7190: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
71a0: 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61   the.** st_dev a
71b0: 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73  nd st_ino fields
71c0: 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72   of the stat str
71d0: 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61  ucture that fsta
71e0: 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a  t() fills in).**
71f0: 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c   and check for l
7200: 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69  ocks already exi
7210: 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e  sting on that in
7220: 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73  ode.  When locks
7230: 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   are.** created 
7240: 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68  or removed, we h
7250: 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f  ave to look at o
7260: 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20  ur own internal 
7270: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a  record of the.**
7280: 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66   locks to see if
7290: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
72a0: 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  has previously s
72b0: 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61  et a lock on tha
72c0: 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e  t same.** inode.
72d0: 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54  .**.** (Aside: T
72e0: 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20  he use of inode 
72f0: 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75  numbers as uniqu
7300: 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77  e IDs does not w
7310: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
7320: 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20  ** For VxWorks, 
7330: 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74  we have to use t
7340: 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75  he alternative u
7350: 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20  nique ID system 
7360: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f  based on.** cano
7370: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61  nical filename a
7380: 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  nd implemented i
7390: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64  n the previous d
73a0: 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20  ivision.).**.** 
73b0: 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  The sqlite3_file
73c0: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50   structure for P
73d0: 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  OSIX is no longe
73e0: 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65  r just an intege
73f0: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
7400: 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77  ptor.  It is now
7410: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
7420: 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65  t holds the inte
7430: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
7440: 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69  riptor and a poi
7450: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74  nter to a struct
7460: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
7470: 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  es the internal.
7480: 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ** locks on the 
7490: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e  corresponding in
74a0: 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ode.  There is o
74b0: 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ne locking struc
74c0: 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64  ture.** per inod
74d0: 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d  e, so if the sam
74e0: 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65  e inode is opene
74f0: 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e  d twice, both un
7500: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
7510: 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  s.** point to th
7520: 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73  e same locking s
7530: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c  tructure.  The l
7540: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
7550: 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65   keeps.** a refe
7560: 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20  rence count (so 
7570: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
7580: 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20  n to delete it) 
7590: 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66  and a "cnt".** f
75a0: 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20  ield that tells 
75b0: 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20  us its internal 
75c0: 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e  lock status.  cn
75d0: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a  t==0 means the.*
75e0: 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  * file is unlock
75f0: 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61  ed.  cnt==-1 mea
7600: 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ns the file has 
7610: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
7620: 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e  k..** cnt>0 mean
7630: 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20  s there are cnt 
7640: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20  shared locks on 
7650: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
7660: 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  Any attempt to l
7670: 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20  ock or unlock a 
7680: 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b  file first check
7690: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  s the locking.**
76a0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
76b0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
76c0: 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76  call is only inv
76d0: 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a  oked to set a .*
76e0: 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20  * POSIX lock if 
76f0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  the internal loc
7700: 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  k structure tran
7710: 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a  sitions between.
7720: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20  ** a locked and 
7730: 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74  an unlocked stat
7740: 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69  e..**.** But wai
7750: 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65  t:  there are ye
7760: 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20  t more problems 
7770: 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73  with POSIX advis
7780: 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  ory locks..**.**
7790: 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   If you close a 
77a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
77b0: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
77c0: 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c   file that has l
77d0: 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63  ocks,.** all loc
77e0: 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ks on that file 
77f0: 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62  that are owned b
7800: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  y the current pr
7810: 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c  ocess are.** rel
7820: 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20  eased.  To work 
7830: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
7840: 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e  lem, each unixIn
7850: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  odeInfo object.*
7860: 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f  * maintains a co
7870: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
7880: 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63  r of pending loc
7890: 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e  ks on tha inode.
78a0: 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65  .** When an atte
78b0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
78c0: 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65  lose an unixFile
78d0: 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a  , if there are.*
78e0: 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65  * other unixFile
78f0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
7900: 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65  e inode that are
7910: 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20   holding locks, 
7920: 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63  the call.** to c
7930: 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20  lose() the file 
7940: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65  descriptor is de
7950: 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c  ferred until all
7960: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c   of the locks cl
7970: 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ear..** The unix
7980: 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74  InodeInfo struct
7990: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
79a0: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
79b0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
79c0: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
79d0: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
79e0: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
79f0: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
7a00: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
7a10: 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f  s..**.** Yet ano
7a20: 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c  ther problem:  L
7a30: 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e  inuxThreads do n
7a40: 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74  ot play well wit
7a50: 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a  h posix locks..*
7a60: 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20  *.** Many older 
7a70: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75  versions of linu
7a80: 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54  x use the LinuxT
7a90: 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77  hreads library w
7aa0: 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70  hich is.** not p
7ab0: 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20  osix compliant. 
7ac0: 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65   Under LinuxThre
7ad0: 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61  ads, a lock crea
7ae0: 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a  ted by thread.**
7af0: 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64   A cannot be mod
7b00: 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64  ified or overrid
7b10: 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65  den by a differe
7b20: 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  nt thread B..** 
7b30: 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61  Only thread A ca
7b40: 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63  n modify the loc
7b50: 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61  k.  Locking beha
7b60: 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a  vior is correct.
7b70: 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61  ** if the applia
7b80: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65  tion uses the ne
7b90: 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78  wer Native Posix
7ba0: 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20   Thread Library 
7bb0: 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e  (NPTL).** on lin
7bc0: 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61  ux - with NPTL a
7bd0: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
7be0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
7bf0: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
7c00: 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75  in thread B.  Bu
7c10: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  t there is no wa
7c20: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  y to know at com
7c30: 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a  pile-time which.
7c40: 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62  ** threading lib
7c50: 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  rary is being us
7c60: 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ed.  So there is
7c70: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
7c80: 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  at.** compile-ti
7c90: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
7ca0: 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  t thread A can o
7cb0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e  verride locks on
7cc0: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
7cd0: 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75  e has to do a ru
7ce0: 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20  n-time check to 
7cf0: 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68  discover the beh
7d00: 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20  avior of the.** 
7d10: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
7d20: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73  .**.** SQLite us
7d30: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69  ed to support Li
7d40: 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74  nuxThreads.  But
7d50: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e   support for Lin
7d60: 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73  uxThreads.** was
7d70: 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69   dropped beginni
7d80: 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20  ng with version 
7d90: 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77  3.7.0.  SQLite w
7da0: 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77  ill still work w
7db0: 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65  ith.** LinuxThre
7dc0: 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61  ads provided tha
7dd0: 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e  t (1) there is n
7de0: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
7df0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70  connection .** p
7e00: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
7e10: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f   in the same pro
7e20: 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74  cess and (2) dat
7e30: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
7e40: 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65  s.** do not move
7e50: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e   across threads.
7e60: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
7e70: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
7e80: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
7e90: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
7ea0: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
7eb0: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
7ec0: 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ar unixInodeInfo
7ed0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75   object..*/.stru
7ee0: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a  ct unixFileId {.
7ef0: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7f10: 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a   Device number *
7f20: 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
7f30: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
7f40: 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f  sFileId *pId;  /
7f50: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
7f60: 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f   for vxworks. */
7f70: 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69  .#else.  ino_t i
7f80: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
7f90: 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75       /* Inode nu
7fa0: 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  mber */.#endif.}
7fb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
7fc0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
7fd0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
7fe0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
7ff0: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
8000: 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e  ode.  Or, on Lin
8010: 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65  uxThreads, there
8020: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   is one of these
8030: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a   structures for.
8040: 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70  ** each inode op
8050: 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72  ened by each thr
8060: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ead..**.** A sin
8070: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
8080: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
8090: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
80a0: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a   each unixFile.*
80b0: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
80c0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
80d0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
80e0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
80f0: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
8100: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
8110: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
8120: 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67  nixFile pointing
8130: 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63   to it..*/.struc
8140: 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  t unixInodeInfo 
8150: 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  {.  struct unixF
8160: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
8170: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75      /* The looku
8180: 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  p key */.  int n
8190: 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20  Shared;         
81a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
81b0: 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c  mber of SHARED l
81c0: 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
81d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69  nsigned char eFi
81e0: 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f  leLock;        /
81f0: 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f  * One of SHARED_
8200: 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
8210: 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e  OCK etc. */.  un
8220: 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f  signed char bPro
8230: 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a  cessLock;     /*
8240: 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72   An exclusive pr
8250: 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65  ocess lock is he
8260: 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ld */.  int nRef
8270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8280: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8290: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
82a0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
82b0: 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
82c0: 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
82d0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
82e0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
82f0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65   with this inode
8300: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b   */.  int nLock;
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8330: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66  of outstanding f
8340: 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55  ile locks */.  U
8350: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
8360: 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  used;          /
8370: 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65  * Unused file de
8380: 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f  scriptors to clo
8390: 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  se */.  unixInod
83a0: 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20  eInfo *pNext;   
83b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
83c0: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
83d0: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Info objects */.
83e0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
83f0: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  *pPrev;         
8400: 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75    /*    .... dou
8410: 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69  bly linked */.#i
8420: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8430: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
8440: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
8450: 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20  ng sharedByte;  
8460: 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c  /* for AFP simul
8470: 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b  ated shared lock
8480: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
8490: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f  S_VXWORKS.  sem_
84a0: 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20  t *pSem;        
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
84c0: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
84d0: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
84e0: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
84f0: 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d  NAME+2];  /* Nam
8500: 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68  e of that semaph
8510: 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ore */.#endif.};
8520: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20  ../*.** A lists 
8530: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
8540: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  Info objects..*/
8550: 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64  .static unixInod
8560: 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74  eInfo *inodeList
8570: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   = 0;../*.**.** 
8580: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
8590: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29  unixLogError_x()
85a0: 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  , is only ever c
85b0: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
85c0: 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72  cro.** unixLogEr
85d0: 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ror()..**.** It 
85e0: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
85f0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
8600: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
8610: 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73  on and errno has
8620: 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74   been.** set. It
8630: 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20   logs a message 
8640: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
8650: 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  g() containing t
8660: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
8670: 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64   of.** errno and
8680: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
8690: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
86a0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
86b0: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a  m strerror() or.
86c0: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  ** strerror_r().
86d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
86e0: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
86f0: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
8700: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
8710: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
8720: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
8730: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
8740: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
8750: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
8760: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
8770: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
8780: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
8790: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
87a0: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
87b0: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e  at.** failed (e.
87c0: 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70  g. "unlink", "op
87d0: 65 6e 22 29 20 61 6e 64 20 74 68 65 20 74 68 65  en") and the the
87e0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
87f0: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a  -system path,.**
8800: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
8810: 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  ine unixLogError
8820: 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78  (a,b,c)     unix
8830: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
8840: 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,b,c,__LINE__).s
8850: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
8860: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
8870: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8890: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
88a0: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
88b0: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
88c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
88d0: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
88e0: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
88f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
8900: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
8910: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
8920: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
8930: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
8940: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
8950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
8960: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
8970: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
8980: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
8990: 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20  r *zErr;        
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89b0: 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72  Message from str
89c0: 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76  error() or equiv
89d0: 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  alent */.  int i
89e0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20  Errno = errno;  
89f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
8a00: 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f  ved syscall erro
8a10: 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f  r number */..  /
8a20: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
8a30: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
8a40: 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45  ild (SQLITE_THRE
8a50: 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e  ADSAFE==0), then
8a60: 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   use.  ** the st
8a70: 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f  rerror() functio
8a80: 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  n to obtain the 
8a90: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
8aa0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
8ab0: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
8ac0: 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  errno. Otherwise
8ad0: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72  , use strerror_r
8ae0: 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51  ()..  */ .#if SQ
8af0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
8b00: 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  && defined(HAVE_
8b10: 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68  STRERROR_R).  ch
8b20: 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d  ar aErr[80];.  m
8b30: 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73  emset(aErr, 0, s
8b40: 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20  izeof(aErr));.  
8b50: 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20  zErr = aErr;..  
8b60: 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52  /* If STRERROR_R
8b70: 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20  _CHAR_P (set by 
8b80: 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73  autoconf scripts
8b90: 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69  ) or __USE_GNU i
8ba0: 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20  s defined,.  ** 
8bb0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
8bc0: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
8bd0: 74 68 65 20 74 68 65 20 47 4e 55 20 76 65 72 73  the the GNU vers
8be0: 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f  ion of strerror_
8bf0: 72 28 29 20 74 68 61 74 20 0a 20 20 2a 2a 20 72  r() that .  ** r
8c00: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
8c10: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
8c20: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f  taining the erro
8c30: 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20  r message. That 
8c40: 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61  pointer .  ** ma
8c50: 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b  y point to aErr[
8c60: 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69  ], or it may poi
8c70: 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69  nt to some stati
8c80: 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68  c storage somewh
8c90: 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  ere. .  ** Other
8ca0: 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  wise, assume tha
8cb0: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
8cc0: 76 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20  vides the POSIX 
8cd0: 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a  version of .  **
8ce0: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77   strerror_r(), w
8cf0: 68 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74  hich always writ
8d00: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
8d10: 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e  age into aErr[].
8d20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
8d30: 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74  e code incorrect
8d40: 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ly assumes that 
8d50: 69 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20  it is the POSIX 
8d60: 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a  version that is.
8d70: 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20    ** available, 
8d80: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
8d90: 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20  e will often be 
8da0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
8db0: 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65   Not a.  ** huge
8dc0: 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72   problem. Incorr
8dd0: 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67  ectly concluding
8de0: 20 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65   that the GNU ve
8df0: 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
8e00: 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c  le .  ** could l
8e10: 65 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c  ead to a segfaul
8e20: 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23  t though..  */.#
8e30: 69 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52  if defined(STRER
8e40: 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c  ROR_R_CHAR_P) ||
8e50: 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47   defined(__USE_G
8e60: 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20  NU).  zErr = .# 
8e70: 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72  endif.  strerror
8e80: 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c  _r(iErrno, aErr,
8e90: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29   sizeof(aErr)-1)
8ea0: 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  ;..#elif SQLITE_
8eb0: 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20  THREADSAFE.  /* 
8ec0: 54 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64  This is a thread
8ed0: 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20  safe build, but 
8ee0: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20  strerror_r() is 
8ef0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a  not available. *
8f00: 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23  /.  zErr = "";.#
8f10: 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68  else.  /* Non-th
8f20: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20  readsafe build, 
8f30: 75 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20  use strerror(). 
8f40: 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65  */.  zErr = stre
8f50: 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65  rror(iErrno);.#e
8f60: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
8f70: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
8f80: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
8f90: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
8fa0: 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  ";.  sqlite3_log
8fb0: 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20  (errcode,.      
8fc0: 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28  "os_unix.c:%d: (
8fd0: 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22  %d) %s(%s) - %s"
8fe0: 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69  ,.      iLine, i
8ff0: 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50  Errno, zFunc, zP
9000: 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a  ath, zErr.  );..
9010: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65    return errcode
9020: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
9030: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
9040: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  or..**.** We ass
9050: 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29  ume that close()
9060: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77   almost always w
9070: 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69  orks, since it i
9080: 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76  s only in a.** v
9090: 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61  ery sick applica
90a0: 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72  tion or on a ver
90b0: 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20  y sick platform 
90c0: 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61  that it might fa
90d0: 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65  il..** If it doe
90e0: 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c  s fail, simply l
90f0: 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73  eak the file des
9100: 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20  criptor, but do 
9110: 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72  log the.** error
9120: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
9130: 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  t it is not safe
9140: 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28   to retry close(
9150: 29 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69  ) after EINTR si
9160: 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  nce the.** file 
9170: 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74  descriptor might
9180: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
9190: 65 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f  en reused by ano
91a0: 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20  ther thread..** 
91b0: 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e  So we don't even
91c0: 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20   try to recover 
91d0: 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20  from an EINTR.  
91e0: 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72  Just log the err
91f0: 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f  or.** and move o
9200: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
9210: 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75  d robust_close(u
9220: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
9230: 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e  int h, int linen
9240: 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73  o){.  if( osClos
9250: 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78  e(h) ){.    unix
9260: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53  LogErrorAtLine(S
9270: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
9280: 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20  E, "close",.    
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92a0: 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65     pFile ? pFile
92b0: 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e  ->zPath : 0, lin
92c0: 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  eno);.  }.}../*.
92d0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  ** Close all fil
92e0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63  e descriptors ac
92f0: 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20  cumuated in the 
9300: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70  unixInodeInfo->p
9310: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20  Unused list..*/ 
9320: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
9330: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69  sePendingFds(uni
9340: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
9350: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
9360: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
9370: 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
9380: 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69  usedFd *p;.  Uni
9390: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
93a0: 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65  ;.  for(p=pInode
93b0: 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d  ->pUnused; p; p=
93c0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
93d0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
93e0: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
93f0: 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c  File, p->fd, __L
9400: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69  INE__);.    sqli
9410: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
9420: 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  .  pInode->pUnus
9430: 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
9440: 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49   Release a unixI
9450: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
9460: 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  re previously al
9470: 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 49  located by findI
9480: 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a  nodeInfo()..**.*
9490: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
94a0: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
94b0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
94c0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
94d0: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
94e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
94f0: 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
9500: 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64  void releaseInod
9510: 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a  eInfo(unixFile *
9520: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
9530: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
9540: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
9550: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
9560: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
9570: 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64  if( ALWAYS(pInod
9580: 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  e) ){.    pInode
9590: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
95a0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  ( pInode->nRef==
95b0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
95c0: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  t( pInode->pShmN
95d0: 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ode==0 );.      
95e0: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
95f0: 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
9600: 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20  ( pInode->pPrev 
9610: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9620: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76  t( pInode->pPrev
9630: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20  ->pNext==pInode 
9640: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
9650: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  e->pPrev->pNext 
9660: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
9670: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9680: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 6e        assert( in
9690: 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20  odeList==pInode 
96a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65  );.        inode
96b0: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  List = pInode->p
96c0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
96d0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
96e0: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
96f0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
9700: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70  >pNext->pPrev==p
9710: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
9720: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
9730: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e  pPrev = pInode->
9740: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20  pPrev;.      }. 
9750: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9760: 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d  e(pInode);.    }
9770: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
9780: 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  ven a file descr
9790: 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68  iptor, locate th
97a0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
97b0: 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64  object that.** d
97c0: 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69  escribes that fi
97d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
97e0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
97f0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20   if necessary.  
9800: 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
9810: 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69  lue might be uni
9820: 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e  nitialized if an
9830: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
9840: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
9850: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
9860: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
9870: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
9880: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
9890: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
98a0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
98b0: 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72  eturn an appropr
98c0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
98d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
98e0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20  indInodeInfo(.  
98f0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9910: 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68  * Unix file with
9920: 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64 20   file desc used 
9930: 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
9940: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a  unixInodeInfo **
9950: 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f  ppInode        /
9960: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69  * Return the uni
9970: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
9980: 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
9990: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99b0: 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74   System call ret
99c0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
99d0: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
99f0: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
9a00: 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f  tor for pFile */
9a10: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
9a20: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20  leId fileId;    
9a30: 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20    /* Lookup key 
9a40: 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  for the unixInod
9a50: 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63  eInfo */.  struc
9a60: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
9a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
9a80: 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f  -level file info
9a90: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69  rmation */.  uni
9aa0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
9ab0: 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43  de = 0;     /* C
9ac0: 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f  andidate unixIno
9ad0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  deInfo object */
9ae0: 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ..  assert( unix
9af0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a  MutexHeld() );..
9b00: 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76    /* Get low-lev
9b10: 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  el information a
9b20: 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68  bout the file th
9b30: 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74  at we can used t
9b40: 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20  o.  ** create a 
9b50: 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20  unique name for 
9b60: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
9b70: 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a   fd = pFile->h;.
9b80: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
9b90: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
9ba0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
9bb0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
9bc0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65  o = errno;.#ifde
9bd0: 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20  f EOVERFLOW.    
9be0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  if( pFile->lastE
9bf0: 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20  rrno==EOVERFLOW 
9c00: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
9c10: 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20  NOLFS;.#endif.  
9c20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9c30: 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64  IOERR;.  }..#ifd
9c40: 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f  ef __APPLE__.  /
9c50: 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20  * On OS X on an 
9c60: 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
9c70: 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  , the inode numb
9c80: 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20  er is reported. 
9c90: 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   ** incorrectly 
9ca0: 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69  for zero-size fi
9cb0: 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74  les.  See ticket
9cc0: 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b   #3260.  To work
9cd0: 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69  .  ** around thi
9ce0: 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f  s problem (we co
9cf0: 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67 20  nsider it a bug 
9d00: 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c  in OS X, not SQL
9d10: 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77  ite).  ** we alw
9d20: 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68 65  ays increase the
9d30: 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20   file size to 1 
9d40: 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  by writing a sin
9d50: 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72  gle byte.  ** pr
9d60: 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67  ior to accessing
9d70: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
9d80: 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65  r.  The one byte
9d90: 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a   written is.  **
9da0: 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63 68   an ASCII 'S' ch
9db0: 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61 6c  aracter which al
9dc0: 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  so happens to be
9dd0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
9de0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64    ** in the head
9df0: 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69  er of every SQLi
9e00: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  te database.  In
9e10: 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68   this way, if th
9e20: 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61  ere.  ** is a ra
9e30: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63  ce condition suc
9e40: 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74  h that another t
9e50: 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64  hread has alread
9e60: 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a  y populated.  **
9e70: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
9e80: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
9e90: 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f   no damage is do
9ea0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
9eb0: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
9ec0: 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46  0 && (pFile->fsF
9ed0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53  lags & SQLITE_FS
9ee0: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21  FLAGS_IS_MSDOS)!
9ef0: 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63  =0 ){.    do{ rc
9f00: 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22   = osWrite(fd, "
9f10: 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20  S", 1); }while( 
9f20: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
9f30: 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20  INTR );.    if( 
9f40: 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  rc!=1 ){.      p
9f50: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
9f60: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
9f70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
9f80: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  RR;.    }.    rc
9f90: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
9fa0: 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
9fb0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
9fc0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
9fd0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
9fe0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9ff0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
a000: 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74  #endif..  memset
a010: 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a  (&fileId, 0, siz
a020: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
a030: 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61  fileId.dev = sta
a040: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
a050: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69   OS_VXWORKS.  fi
a060: 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  leId.pId = pFile
a070: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66  ->pId;.#else.  f
a080: 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74  ileId.ino = stat
a090: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
a0a0: 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  if.  pInode = in
a0b0: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
a0c0: 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63  ( pInode && memc
a0d0: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e  mp(&fileId, &pIn
a0e0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  ode->fileId, siz
a0f0: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
a100: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
a110: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ode->pNext;.  }.
a120: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
a130: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
a140: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
a150: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20  sizeof(*pInode) 
a160: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
a170: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
a180: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
a190: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
a1a0: 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73  set(pInode, 0, s
a1b0: 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b  izeof(*pInode));
a1c0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e  .    memcpy(&pIn
a1d0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69  ode->fileId, &fi
a1e0: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
a1f0: 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64  eId));.    pInod
a200: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  e->nRef = 1;.   
a210: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d   pInode->pNext =
a220: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
a230: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20  pInode->pPrev = 
a240: 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65  0;.    if( inode
a250: 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74  List ) inodeList
a260: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
a270: 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20  ;.    inodeList 
a280: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73  = pInode;.  }els
a290: 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e{.    pInode->n
a2a0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
a2b0: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a  Inode = pInode;.
a2c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a2d0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
a2e0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
a2f0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
a300: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
a310: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
a320: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
a330: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
a340: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
a350: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
a360: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
a370: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
a380: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
a390: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
a3a0: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
a3b0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
a3c0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
a3d0: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
a3e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
a3f0: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
a400: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
a410: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
a420: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
a430: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
a440: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
a450: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a460: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
a470: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
a480: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
a490: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
a4a0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
a4b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
a4c0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
a4d0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
a4e0: 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74  ile );.  unixEnt
a4f0: 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
a500: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
a510: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
a520: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
a530: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
a540: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
a550: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
a560: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
a570: 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
a580: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
a590: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
a5a0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
a5b0: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
a5c0: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
a5d0: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
a5e0: 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65   it..  */.#ifnde
a5f0: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66  f __DJGPP__.  if
a600: 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20 21  ( !reserved && !
a610: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pFile->pInode->b
a620: 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20  ProcessLock ){. 
a630: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
a640: 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  lock;.    lock.l
a650: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
a660: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
a670: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
a680: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
a690: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  _len = 1;.    lo
a6a0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
a6b0: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46  LCK;.    if( osF
a6c0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
a6d0: 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29  _GETLK, &lock) )
a6e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
a6f0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
a700: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20  ESERVEDLOCK;.   
a710: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
a720: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
a730: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
a740: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
a750: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
a760: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
a770: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e  }.#endif.  .  un
a780: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
a790: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
a7a0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
a7b0: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
a7c0: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
a7d0: 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
a7e0: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
a7f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a800: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
a810: 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63  set a system-loc
a820: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46  k on the file pF
a830: 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ile.  The lock i
a840: 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  s .** described 
a850: 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  by pLock..**.** 
a860: 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73  If the pFile was
a870: 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69   opened read/wri
a880: 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63  te from unix-exc
a890: 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79  l, then the only
a8a0: 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62   lock.** ever ob
a8b0: 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63  tained is an exc
a8c0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64  lusive lock, and
a8d0: 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20   it is obtained 
a8e0: 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20  exactly once.** 
a8f0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
a900: 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d  ny lock is attem
a910: 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65  pted.  All subse
a920: 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63  quent system loc
a930: 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  king.** operatio
a940: 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73  ns become no-ops
a950: 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  .  Locking opera
a960: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70  tions still happ
a970: 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a  en internally,.*
a980: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
a990: 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20  ordinate access 
a9a0: 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65  between separate
a9b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
a9c0: 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20  tions.** within 
a9d0: 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75  this process, bu
a9e0: 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73  t all of that is
a9f0: 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f   handled in memo
aa00: 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70  ry and the.** op
aa10: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64  erating system d
aa20: 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70  oes not particip
aa30: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
aa40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61  function is a pa
aa50: 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63  ss-through to fc
aa60: 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20  ntl(F_SETLK) if 
aa70: 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a  pFile is using.*
aa80: 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20  * any VFS other 
aa90: 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  than "unix-excl"
aaa0: 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20   or if pFile is 
aab0: 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d  opened on "unix-
aac0: 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20  excl".** and is 
aad0: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  read-only..**.**
aae0: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
aaf0: 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f  d if the call co
ab00: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
ab10: 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61  ully, or -1 if a
ab20: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74   call.** to fcnt
ab30: 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68  l() fails. In th
ab40: 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69  is case, errno i
ab50: 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74  s set appropriat
ab60: 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29  ely (by fcntl())
ab70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ab80: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69  unixFileLock(uni
ab90: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74  xFile *pFile, st
aba0: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63  ruct flock *pLoc
abb0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  k){.  int rc;.  
abc0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
abd0: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
abe0: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
abf0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
ac00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
ac10: 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  node!=0 );.  if(
ac20: 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c   ((pFile->ctrlFl
ac30: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 45  ags & UNIXFILE_E
ac40: 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64  XCL)!=0 || pInod
ac50: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29  e->bProcessLock)
ac60: 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e  .   && ((pFile->
ac70: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
ac80: 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29  FILE_RDONLY)==0)
ac90: 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  .  ){.    if( pI
aca0: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
acb0: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ck==0 ){.      s
acc0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
acd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ace0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
acf0: 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   );.      lock.l
ad00: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
ad10: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
ad20: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
ad30: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
ad40: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
ad50: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _SIZE;.      loc
ad60: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
ad70: 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  CK;.      rc = o
ad80: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
ad90: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
ada0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30  ;.      if( rc<0
adb0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
adc0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f      pInode->bPro
add0: 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  cessLock = 1;.  
ade0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
adf0: 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  k++;.    }else{.
ae00: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
ae10: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
ae20: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
ae30: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
ae40: 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72   pLock);.  }.  r
ae50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ae60: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
ae70: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
ae80: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
ae90: 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
aea0: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
aeb0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
aec0: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
aed0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
aee0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
aef0: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
af00: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
af10: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
af20: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
af30: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
af40: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
af50: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
af60: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
af70: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
af80: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
af90: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
afa0: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
afb0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
afc0: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
afd0: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
afe0: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
aff0: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
b000: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
b010: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
b020: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
b030: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
b040: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
b050: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
b060: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
b070: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
b080: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
b090: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
b0a0: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
b0b0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
b0c0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
b0d0: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
b0e0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
b0f0: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
b100: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
b110: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b120: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
b130: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
b140: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
b150: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
b160: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
b170: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
b180: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
b190: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
b1a0: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
b1b0: 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Lock){.  /* The 
b1c0: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
b1d0: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
b1e0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
b1f0: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
b200: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
b210: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
b220: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
b230: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
b240: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
b250: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
b260: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
b270: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
b280: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
b290: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
b2a0: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
b2b0: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
b2c0: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
b2d0: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
b2e0: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
b2f0: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
b300: 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79   with windows sy
b310: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
b320: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
b330: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
b340: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
b350: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
b360: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
b370: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
b380: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
b390: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
b3a0: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
b3b0: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
b3c0: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
b3d0: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
b3e0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
b3f0: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
b400: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
b410: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
b420: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
b430: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
b440: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
b450: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
b460: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
b470: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
b480: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
b490: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
b4a0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
b4b0: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
b4c0: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
b4d0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
b4e0: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e  s read-locked an
b4f0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
b500: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
b510: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a   released..  **.
b520: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
b530: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
b540: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
b550: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
b560: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
b570: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
b580: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
b590: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
b5a0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
b5b0: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
b5c0: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
b5d0: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
b5e0: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
b5f0: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
b600: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
b610: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
b620: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
b630: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
b640: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
b650: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
b660: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
b670: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
b680: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
b690: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
b6a0: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
b6b0: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
b6c0: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
b6d0: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
b6e0: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
b6f0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
b700: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
b710: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
b720: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
b730: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
b740: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
b750: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
b760: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
b770: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
b780: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
b790: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
b7a0: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
b7b0: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
b7c0: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
b7d0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
b7e0: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
b7f0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
b800: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
b810: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
b820: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
b830: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
b840: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
b850: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
b860: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
b870: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
b880: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
b890: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
b8a0: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
b8b0: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
b8c0: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a  database. .  **.
b8d0: 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20    ** The reason 
b8e0: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  a single byte ca
b8f0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73  nnot be used ins
b900: 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61  tead of the 'sha
b910: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
b920: 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d  nge' is that som
b930: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69  e versions of wi
b940: 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70  ndows do not sup
b950: 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  port read-locks.
b960: 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   By.  ** locking
b970: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
b980: 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e  rom a range, con
b990: 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c  current SHARED l
b9a0: 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20  ocks may exist. 
b9b0: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20   ** even if the 
b9c0: 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
b9d0: 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73  e used is always
b9e0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20   a write-lock.. 
b9f0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
ba00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
ba10: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
ba20: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
ba30: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
ba40: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
ba50: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
ba60: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
ba70: 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20   tErrno = 0;..  
ba80: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ba90: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
baa0: 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
bab0: 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
bac0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
bad0: 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ->h,.      azFil
bae0: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
baf0: 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
bb00: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
bb10: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
bb20: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
bb30: 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ck), pInode->nSh
bb40: 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29  ared , getpid())
bb50: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
bb60: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
bb70: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
bb80: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
bb90: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
bba0: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
bbb0: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
bbc0: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
bbd0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
bbe0: 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
bbf0: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
bc00: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
bc10: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
bc20: 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
bc30: 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
bc40: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
bc50: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
bc60: 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  d) (unix)\n", pF
bc70: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
bc80: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
bc90: 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
bca0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bcb0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
bcc0: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
bcd0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
bce0: 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31  orrect..  **  (1
bcf0: 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
bd00: 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
bd10: 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
bd20: 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
bd30: 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
bd40: 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
bd50: 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
bd60: 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
bd70: 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
bd80: 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
bd90: 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
bda0: 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
bdb0: 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
bdc0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
bdd0: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
bde0: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
bdf0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
be00: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
be10: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
be20: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
be30: 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
be40: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
be50: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
be60: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
be70: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
be80: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
be90: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
bea0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
beb0: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
bec0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
bed0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
bee0: 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
bef0: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
bf00: 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
bf10: 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
bf20: 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
bf30: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
bf40: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
bf50: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
bf60: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
bf70: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
bf80: 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
bf90: 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
bfa0: 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d          (pInode-
bfb0: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
bfc0: 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
bfd0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
bfe0: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
bff0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
c000: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c010: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
c020: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
c030: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
c040: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
c050: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
c060: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
c070: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
c080: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
c090: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
c0a0: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
c0b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
c0c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
c0d0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c0e0: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49  CK && .      (pI
c0f0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
c100: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
c110: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
c120: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
c130: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
c140: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
c150: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
c160: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
c170: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
c180: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c190: 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
c1a0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
c1b0: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
c1c0: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
c1d0: 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
c1e0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
c1f0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c200: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50  ;.  }...  /* A P
c210: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
c220: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
c230: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
c240: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
c250: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
c260: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
c270: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
c280: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
c290: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
c2a0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
c2b0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
c2c0: 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  L;.  lock.l_when
c2d0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
c2e0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
c2f0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
c300: 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
c310: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
c320: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
c330: 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
c340: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
c350: 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65  .l_type = (eFile
c360: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c370: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
c380: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
c390: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
c3a0: 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  YTE;.    if( uni
c3b0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
c3c0: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
c3d0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
c3e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c3f0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
c400: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
c410: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
c420: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c430: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
c440: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
c450: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
c460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c470: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
c480: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
c490: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
c4a0: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
c4b0: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
c4c0: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
c4d0: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
c4e0: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
c4f0: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
c500: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
c510: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
c520: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
c530: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
c540: 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
c550: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
c560: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
c570: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
c580: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
c590: 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
c5a0: 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead-lock */.    
c5b0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
c5c0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
c5d0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
c5e0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69  ARED_SIZE;.    i
c5f0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
c600: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
c610: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
c620: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
c630: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
c640: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
c650: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
c660: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20  _LOCK);.    }.. 
c670: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
c680: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
c690: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
c6a0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
c6b0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
c6c0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
c6d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
c6e0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
c6f0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
c700: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20  File, &lock) && 
c710: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c720: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
c730: 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
c740: 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
c750: 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   */.      tErrno
c760: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
c770: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
c780: 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d  R_UNLOCK; .    }
c790: 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ..    if( rc ){.
c7a0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c7b0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
c7c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
c7d0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
c7e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
c7f0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
c800: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
c810: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
c820: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
c830: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
c840: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
c850: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
c860: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
c870: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
c880: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
c890: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
c8a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
c8b0: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
c8c0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
c8d0: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
c8e0: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
c8f0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
c900: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
c910: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
c920: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
c930: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
c940: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
c950: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
c960: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
c970: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
c980: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
c990: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
c9a0: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
c9b0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
c9c0: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
c9d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
c9e0: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
c9f0: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
ca00: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ca10: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
ca20: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
ca30: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
ca40: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
ca50: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
ca60: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
ca70: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
ca80: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
ca90: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
caa0: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
cab0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
cac0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
cad0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
cae0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
caf0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
cb00: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
cb10: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
cb20: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
cb30: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
cb40: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
cb50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
cb60: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
cb70: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
cb80: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
cb90: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
cba0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
cbb0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
cbc0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
cbd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
cbe0: 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    ..#ifndef NDEB
cbf0: 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  UG.  /* Set up t
cc00: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63  he transaction-c
cc10: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68  ounter change ch
cc20: 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65  ecking flags whe
cc30: 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f  n.  ** transitio
cc40: 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52  ning from a SHAR
cc50: 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44  ED to a RESERVED
cc60: 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e   lock.  The chan
cc70: 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41  ge.  ** from SHA
cc80: 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20  RED to RESERVED 
cc90: 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e  marks the beginn
cca0: 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a  ing of a normal.
ccb0: 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61    ** write opera
ccc0: 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20  tion (not a hot 
ccd0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
cce0: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  )..  */.  if( rc
ccf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
cd00: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
cd10: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  ck<=SHARED_LOCK.
cd20: 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d     && eFileLock=
cd30: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20  =RESERVED_LOCK. 
cd40: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74   ){.    pFile->t
cd50: 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30  ransCntrChng = 0
cd60: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  ;.    pFile->dbU
cd70: 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  pdate = 0;.    p
cd80: 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
cd90: 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e  ite = 1;.  }.#en
cda0: 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d  dif...  if( rc==
cdb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cdc0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
cdd0: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
cde0: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
cdf0: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
ce00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
ce10: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
ce20: 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
ce30: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
ce40: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
ce50: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
ce60: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
ce70: 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c  LOCK;.  }..end_l
ce80: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
ce90: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
cea0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
ceb0: 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c  %s %s (unix)\n",
cec0: 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
ced0: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
cee0: 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  , .      rc==SQL
cef0: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
cf00: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
cf10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cf20: 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64  * Add the file d
cf30: 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62  escriptor used b
cf40: 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46  y file handle pF
cf50: 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ile to the corre
cf60: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75  sponding.** pUnu
cf70: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  sed list..*/.sta
cf80: 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64  tic void setPend
cf90: 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a  ingFd(unixFile *
cfa0: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
cfb0: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
cfc0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
cfd0: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
cfe0: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75  *p = pFile->pUnu
cff0: 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  sed;.  p->pNext 
d000: 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  = pInode->pUnuse
d010: 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  d;.  pInode->pUn
d020: 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c  used = p;.  pFil
d030: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69  e->h = -1;.  pFi
d040: 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b  le->pUnused = 0;
d050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
d060: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
d070: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
d080: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
d090: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
d0a0: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
d0b0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
d0c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
d0d0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
d0e0: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
d0f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
d100: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
d110: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
d120: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
d130: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
d140: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
d150: 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65  ** .** If handle
d160: 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75  NFSUnlock is tru
d170: 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67  e, then on downg
d180: 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  rading an EXCLUS
d190: 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52  IVE_LOCK to SHAR
d1a0: 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72  ED.** the byte r
d1b0: 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20  ange is divided 
d1c0: 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64  into 2 parts and
d1d0: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
d1e0: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  is unlocked then
d1f0: 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61  .** set to a rea
d200: 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  d lock, then the
d210: 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73   other part is s
d220: 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  imply unlocked. 
d230: 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20   This works .** 
d240: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
d250: 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61  BSD NFS lockd (a
d260: 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f  lso seen on MacO
d270: 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66  SX 10.3+) that f
d280: 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f  ails to .** remo
d290: 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ve the write loc
d2a0: 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68  k on a region wh
d2b0: 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
d2c0: 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s set..*/.static
d2d0: 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b   int posixUnlock
d2e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
d2f0: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
d300: 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
d310: 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
d320: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
d330: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
d340: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
d350: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
d360: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
d370: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
d380: 20 69 6e 74 20 68 3b 0a 0a 20 20 61 73 73 65 72   int h;..  asser
d390: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
d3a0: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
d3b0: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
d3c0: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
d3d0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
d3e0: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
d3f0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d400: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
d410: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
d420: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
d430: 72 65 64 2c 0a 20 20 20 20 20 20 67 65 74 70 69  red,.      getpi
d440: 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  d()));..  assert
d450: 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
d460: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
d470: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
d480: 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
d490: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d4a0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
d4b0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
d4c0: 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20   h = pFile->h;. 
d4d0: 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
d4e0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
d4f0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
d500: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
d510: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
d520: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
d530: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
d540: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
d550: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
d560: 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
d570: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
d580: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
d590: 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
d5a0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
d5b0: 72 42 65 6e 69 67 6e 28 30 29 3b 0a 0a 23 69 66  rBenign(0);..#if
d5c0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
d5d0: 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
d5e0: 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
d5f0: 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
d600: 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
d610: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
d620: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
d630: 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
d640: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
d650: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
d660: 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
d670: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
d680: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
d690: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
d6a0: 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
d6b0: 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
d6c0: 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
d6d0: 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
d6e0: 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
d6f0: 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
d700: 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
d710: 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
d720: 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
d730: 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
d740: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
d750: 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
d760: 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
d770: 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
d780: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
d790: 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
d7a0: 23 69 66 20 30 0a 20 20 20 20 61 73 73 65 72 74  #if 0.    assert
d7b0: 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
d7c0: 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20  lWrite==0.      
d7d0: 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55     || pFile->dbU
d7e0: 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  pdate==0.       
d7f0: 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e    || pFile->tran
d800: 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a  sCntrChng==1 );.
d810: 23 65 6e 64 69 66 0a 20 20 20 20 70 46 69 6c 65  #endif.    pFile
d820: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
d830: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
d840: 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   /* downgrading 
d850: 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
d860: 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73   on NFS involves
d870: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72   clearing the wr
d880: 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  ite lock.    ** 
d890: 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68  before establish
d8a0: 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b  ing the readlock
d8b0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61   - to avoid a ra
d8c0: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20  ce condition we 
d8d0: 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a  downgrade.    **
d8e0: 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62   the lock in 2 b
d8f0: 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70  locks, so that p
d900: 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
d910: 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64   will be covered
d920: 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72   by a .    ** wr
d930: 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74  ite lock until t
d940: 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72  he rest is cover
d950: 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63  ed by a read loc
d960: 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20  k:.    **  1:   
d970: 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20  [WWWWW].    **  
d980: 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20  2:   [....W].   
d990: 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57   **  3:   [RRRRW
d9a0: 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b  ].    **  4:   [
d9b0: 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20  RRRR.].    */.  
d9c0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
d9d0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
d9e0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  .#if !defined(__
d9f0: 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c  APPLE__) || !SQL
da00: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
da10: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28  NG_STYLE.      (
da20: 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e  void)handleNFSUn
da30: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  lock;.      asse
da40: 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  rt( handleNFSUnl
da50: 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  ock==0 );.#endif
da60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
da70: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
da80: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
da90: 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28  _STYLE.      if(
daa0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
dab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
dac0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
dad0: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
dae0: 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20  ode from system 
daf0: 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  call errors */. 
db00: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76         off_t div
db10: 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49  Size = SHARED_SI
db20: 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ZE - 1;.        
db30: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
db40: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
db50: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
db60: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
db70: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
db80: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
db90: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
dba0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53  ock.l_len = divS
dbb0: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
dbc0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
dbd0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
dbe0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
dbf0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
dc00: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
dc10: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
dc20: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
dc30: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
dc40: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
dc50: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
dc60: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
dc70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dc80: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
dc90: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
dca0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
dcb0: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
dcc0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
dcd0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
dce0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
dcf0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
dd00: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
dd10: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
dd20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
dd30: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
dd40: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
dd50: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
dd60: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
dd70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
dd80: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
dd90: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
dda0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
ddb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
ddc0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
ddd0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
dde0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
ddf0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
de00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
de10: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
de20: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
de30: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
de40: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
de50: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
de60: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
de70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
de80: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
de90: 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ST+divSize;.    
dea0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
deb0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76   SHARED_SIZE-div
dec0: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
ded0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
dee0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  File, &lock)==(-
def0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
df00: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
df10: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
df20: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
df30: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  CK;.          if
df40: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
df50: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
df60: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
df70: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
df80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df90: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
dfa0: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
dfb0: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
dfc0: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
dfd0: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
dfe0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
dff0: 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20  _STYLE */.      
e000: 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  {.        lock.l
e010: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
e020: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e030: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
e040: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
e050: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
e060: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
e070: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
e080: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
e090: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e0a0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
e0c0: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20   In theory, the 
e0d0: 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65  call to unixFile
e0e0: 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61  Lock() cannot fa
e0f0: 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  il because anoth
e100: 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
e110: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
e120: 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ng an incompatib
e130: 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64  le lock. If it d
e140: 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20  oes, this .     
e150: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65       ** indicate
e160: 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  s that the other
e170: 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
e180: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f  following the lo
e190: 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  cking.          
e1a0: 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20  ** protocol. If 
e1b0: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65  this happens, re
e1c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
e1d0: 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e  R_RDLOCK. Return
e1e0: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
e1f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75   SQLITE_BUSY wou
e200: 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75  ld confuse the u
e210: 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70  pper layer (in p
e220: 72 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65  ractice it cause
e230: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
e240: 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69  an assert to fai
e250: 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  l). */ .        
e260: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e270: 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_RDLOCK;.    
e280: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
e290: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e2a0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
e2b0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
e2c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e2d0: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
e2e0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
e2f0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
e300: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
e310: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
e320: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
e330: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
e340: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
e350: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
e360: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
e370: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
e380: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
e390: 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  0 ){.      pInod
e3a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
e3b0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
e3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
e3d0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
e3e0: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69  NLOCK;.      pFi
e3f0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e400: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67 6f 74  errno;.      got
e410: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
e420: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46    }.  }.  if( eF
e430: 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
e440: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   ){.    /* Decre
e450: 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
e460: 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
e470: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
e480: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
e490: 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
e4a0: 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
e4b0: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
e4c0: 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
e4d0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
e4e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
e4f0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
e500: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
e510: 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
e520: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
e530: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
e540: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
e550: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
e560: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e570: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
e580: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
e590: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
e5a0: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
e5b0: 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
e5c0: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
e5d0: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
e5e0: 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46  .      if( unixF
e5f0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
e600: 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
e610: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
e620: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
e630: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e640: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e650: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
e660: 09 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e  .pFile->lastErrn
e670: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e680: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
e690: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
e6a0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
e6b0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
e6c0: 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
e6d0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
e6e0: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
e6f0: 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
e700: 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
e710: 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
e720: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
e730: 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
e740: 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
e750: 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
e760: 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
e770: 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
e780: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
e790: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
e7a0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
e7b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
e7c0: 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
e7d0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
e7e0: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
e7f0: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
e800: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
e810: 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a   }...end_unlock:
e820: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
e830: 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
e840: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
e850: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
e860: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
e870: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
e880: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
e890: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
e8a0: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
e8b0: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
e8c0: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
e8d0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
e8e0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
e8f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
e900: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
e910: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
e920: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
e930: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
e940: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
e950: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
e960: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
e970: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
e980: 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71  nt unixUnlock(sq
e990: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e9a0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
e9b0: 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e    return posixUn
e9c0: 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
e9d0: 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ck, 0);.}../*.**
e9e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
e9f0: 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74  erforms the part
ea00: 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20  s of the "close 
ea10: 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20  file" operation 
ea20: 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  .** common to al
ea30: 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  l locking scheme
ea40: 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65  s. It closes the
ea50: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66   directory and f
ea60: 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20  ile.** handles, 
ea70: 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69  if they are vali
ea80: 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20  d, and sets all 
ea90: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e  fields of the un
eaa0: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
eab0: 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  ure to 0..**.** 
eac0: 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65  It is *not* nece
ead0: 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  ssary to hold th
eae0: 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69  e mutex when thi
eaf0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
eb00: 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20  led,.** even on 
eb10: 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65  VxWorks.  A mute
eb20: 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72  x will be acquir
eb30: 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79  ed on VxWorks by
eb40: 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52   the.** vxworksR
eb50: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72  eleaseFileId() r
eb60: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
eb70: 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46  c int closeUnixF
eb80: 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ile(sqlite3_file
eb90: 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
eba0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
ebb0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20  File*)id;.  if( 
ebc0: 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
ebd0: 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
ebe0: 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
ebf0: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
ec00: 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
ec10: 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b   }.#if OS_VXWORK
ec20: 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  S.  if( pFile->p
ec30: 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  Id ){.    if( pF
ec40: 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b  ile->isDelete ){
ec50: 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
ec60: 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e  pFile->pId->zCan
ec70: 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
ec80: 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65   }.    vxworksRe
ec90: 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c  leaseFileId(pFil
eca0: 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69  e->pId);.    pFi
ecb0: 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d  le->pId = 0;.  }
ecc0: 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
ecd0: 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E(("CLOSE   %-3d
ece0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
ecf0: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
ed00: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
ed10: 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  ee(pFile->pUnuse
ed20: 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69  d);.  memset(pFi
ed30: 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
ed40: 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75  ixFile));.  retu
ed50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ed60: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
ed70: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
ed80: 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c  nt unixClose(sql
ed90: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
eda0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
edb0: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
edc0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
edd0: 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78  ile *)id;.  unix
ede0: 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
edf0: 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  CK);.  unixEnter
ee00: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75  Mutex();..  /* u
ee10: 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69  nixFile.pInode i
ee20: 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68  s always valid h
ee30: 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ere. Otherwise, 
ee40: 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73  a different clos
ee50: 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28  e.  ** routine (
ee60: 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  e.g. nolockClose
ee70: 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c  ()) would be cal
ee80: 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a  led instead..  *
ee90: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
eea0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
eeb0: 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e  >0 || pFile->pIn
eec0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
eed0: 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c  k==0 );.  if( AL
eee0: 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  WAYS(pFile->pIno
eef0: 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  de) && pFile->pI
ef00: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
ef10: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
ef20: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
ef30: 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
ef40: 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
ef50: 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
ef60: 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
ef70: 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
ef80: 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
ef90: 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
efa0: 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
efb0: 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
efc0: 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
efd0: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
efe0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
eff0: 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c     ** when the l
f000: 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
f010: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
f020: 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
f030: 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
f040: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
f050: 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65  e);.  rc = close
f060: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
f070: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
f080: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f090: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
f0a0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  * End of the pos
f0b0: 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
f0c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0e0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
f0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f130: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
f140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f180: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
f190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1a0: 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20  * No-op Locking 
f1b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1d0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20  **.**.** Of the 
f1e0: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  various locking 
f1f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
f200: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
f210: 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a  is by far the.**
f220: 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b   simplest:  lock
f230: 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ing is ignored. 
f240: 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   No attempt is m
f250: 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  ade to lock the 
f260: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
f270: 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
f280: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  writing..**.** T
f290: 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
f2a0: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
f2b0: 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d  for use on read-
f2c0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a  only databases.*
f2d0: 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73  * (ex: databases
f2e0: 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64   that are burned
f2f0: 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f   into CD-ROM, fo
f300: 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20  r example.)  It 
f310: 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75  can.** also be u
f320: 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69  sed if the appli
f330: 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73  cation employs s
f340: 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63  ome external mec
f350: 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65  hanism to.** pre
f360: 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75  vent simultaneou
f370: 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20  s access of the 
f380: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79  same database by
f390: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
f3a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f3b0: 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65  ions.  But there
f3c0: 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69   is a serious ri
f3d0: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a  sk of database.*
f3e0: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20  * corruption if 
f3f0: 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  this locking mod
f400: 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74  e is used in sit
f410: 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75  uations where mu
f420: 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61  ltiple.** databa
f430: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
f440: 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
f450: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
f460: 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a  ile at the same.
f470: 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20  ** time and one 
f480: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or more of those
f490: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
f4a0: 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74   writing..*/..st
f4b0: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
f4c0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
f4d0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
f4e0: 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65  otUsed, int *pRe
f4f0: 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sOut){.  UNUSED_
f500: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
f510: 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  d);.  *pResOut =
f520: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
f530: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
f540: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28   int nolockLock(
f550: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
f560: 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
f570: 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
f580: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
f590: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
f5a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f5b0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
f5c0: 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  olockUnlock(sqli
f5d0: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
f5e0: 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
f5f0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
f600: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
f610: 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
f620: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f630: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
f640: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
f650: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65   int nolockClose
f660: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f670: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c  d) {.  return cl
f680: 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
f690: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
f6a0: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
f6b0: 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69  the no-op lock i
f6c0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
f6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6e0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
f6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f730: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
f740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f780: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
f790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
f7a0: 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f  egin dot-file Lo
f7b0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
f7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7d0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
f7e0: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  otfile locking i
f7f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
f800: 65 73 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  es the existance
f810: 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63   of separate loc
f820: 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20 6f 72  k.** files in or
f830: 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61  der to control a
f840: 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
f850: 61 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72  abase.  This wor
f860: 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20 61 62  ks on just.** ab
f870: 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79  out every filesy
f880: 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e  stem imaginable.
f890: 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20    But there are 
f8a0: 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65  serious downside
f8b0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
f8c0: 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63   There is zero c
f8d0: 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73  oncurrency.  A s
f8e0: 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f  ingle reader blo
f8f0: 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a  cks all other.**
f900: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
f910: 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e  ions from readin
f920: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
f930: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
f940: 20 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c      (2)  An appl
f950: 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72  ication crash or
f960: 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20   power loss can 
f970: 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b  leave stale lock
f980: 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20   files.**       
f990: 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64    sitting around
f9a0: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
f9b0: 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c   cleared manuall
f9c0: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68  y..**.** Neverth
f9d0: 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b  eless, a dotlock
f9e0: 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61   is an appropria
f9f0: 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  te locking mode 
fa00: 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a  for use if no.**
fa10: 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73   other locking s
fa20: 74 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c  trategy is avail
fa30: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66  able..**.** Dotf
fa40: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  ile locking work
fa50: 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  s by creating a 
fa60: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
fa70: 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
fa80: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e  e.** database an
fa90: 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
faa0: 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
fab0: 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
fac0: 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
fad0: 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 6c  existance of a l
fae0: 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69 65 73  ock file implies
faf0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
fb00: 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 6c  ck.  All other l
fb10: 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28 53 48  ock.** types (SH
fb20: 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
fb30: 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70  PENDING) are map
fb40: 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49  ped into EXCLUSI
fb50: 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  VE..*/../*.** Th
fb60: 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64  e file suffix ad
fb70: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
fb80: 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e  base filename in
fb90: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
fba0: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c   the.** lock fil
fbb0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f  e..*/.#define DO
fbc0: 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c  TLOCK_SUFFIX ".l
fbd0: 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ock"../*.** This
fbe0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
fbf0: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
fc00: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
fc10: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
fc20: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
fc30: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
fc40: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
fc50: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
fc60: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
fc70: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
fc80: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
fc90: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
fca0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
fcb0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
fcc0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
fcd0: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
fce0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
fcf0: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
fd00: 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c  .**.** In dotfil
fd10: 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65  e locking, eithe
fd20: 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20  r a lock exists 
fd30: 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20  or it does not. 
fd40: 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76   So in this.** v
fd50: 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63  ariation of Chec
fd60: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c  kReservedLock(),
fd70: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
fd80: 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20   to true if any 
fd90: 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20  lock.** is held 
fda0: 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
fdb0: 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c  false if the fil
fdc0: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  e is unlocked..*
fdd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
fde0: 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
fdf0: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
fe00: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
fe10: 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
fe20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
fe30: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
fe40: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
fe50: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
fe60: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
fe70: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
fe80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
fe90: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
fea0: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
feb0: 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
fec0: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
fed0: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
fee0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
fef0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
ff00: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
ff10: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
ff20: 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63  /* Either this c
ff30: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d  onnection or som
ff40: 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
ff50: 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  on in the same p
ff60: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f  rocess.    ** ho
ff70: 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  lds a lock on th
ff80: 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64  e file.  No need
ff90: 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65   to check furthe
ffa0: 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76  r. */.    reserv
ffb0: 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
ffc0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  .    /* The lock
ffd0: 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20   is held if and 
ffe0: 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  only if the lock
fff0: 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
10000 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
10010 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73  LockFile = (cons
10020 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
10030 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
10040 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73     reserved = os
10050 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65  Access(zLockFile
10060 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f  , 0)==0;.  }.  O
10070 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
10080 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
10090 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69  dotlock)\n", pFi
100a0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
100b0 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75  ved));.  *pResOu
100c0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
100d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
100e0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
100f0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
10100 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
10110 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
10120 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
10130 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
10140 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
10150 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
10160 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
10170 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
10180 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
10190 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
101a0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
101b0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
101c0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
101d0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
101e0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
101f0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
10200 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
10210 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
10220 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
10230 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
10240 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
10250 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
10260 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
10270 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
10280 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
10290 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
102a0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
102b0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
102c0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
102d0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
102e0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
102f0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
10300 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
10310 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
10320 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
10330 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
10340 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
10350 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
10360 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
10370 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
10380 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
10390 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
103a0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
103b0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
103c0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
103d0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
103e0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
103f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
10400 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c  *.** With dotfil
10410 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65  e locking, we re
10420 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ally only suppor
10430 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43  t state (4): EXC
10440 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77  LUSIVE..** But w
10450 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65  e track the othe
10460 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  r locking levels
10470 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a   internally..*/.
10480 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
10490 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
104a0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
104b0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
104c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
104d0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
104e0 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20 2a 7a  nt fd;.  char *z
104f0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
10500 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
10510 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
10520 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10530 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
10540 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e  e any lock, then
10550 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
10560 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
10570 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  All we have.  **
10580 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74   to do is adjust
10590 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65   our internal re
105a0 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b  cord of the lock
105b0 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69   level..  */.  i
105c0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
105d0 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b  ock > NO_LOCK ){
105e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
105f0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
10600 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  k;.    /* Always
10610 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65   update the time
10620 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64  stamp on the old
10630 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20   file */.#ifdef 
10640 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75  HAVE_UTIME.    u
10650 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  time(zLockFile, 
10660 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20  NULL);.#else.   
10670 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c   utimes(zLockFil
10680 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  e, NULL);.#endif
10690 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
106a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
106b0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
106c0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66  sive lock */.  f
106d0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
106e0 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e  zLockFile,O_RDON
106f0 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43  LY|O_CREAT|O_EXC
10700 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28 20 66  L,0600);.  if( f
10710 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61  d<0 ){.    /* fa
10720 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65  iled to open/cre
10730 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20 73 6f  ate the file, so
10740 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20 68  meone else may h
10750 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c  ave stolen the l
10760 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  ock */.    int t
10770 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
10780 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d     if( EEXIST ==
10790 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
107a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
107b0 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  Y;.    } else {.
107c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
107d0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
107e0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
107f0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
10800 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
10810 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
10820 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
10830 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
10840 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
10850 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10860 20 20 7d 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c    } .  robust_cl
10870 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f  ose(pFile, fd, _
10880 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 0a 20 20 2f  _LINE__);.  .  /
10890 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
108a0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
108b0 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
108c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
108d0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
108e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
108f0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
10900 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
10910 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
10920 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
10930 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
10940 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
10950 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
10960 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
10970 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
10980 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
10990 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
109a0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
109b0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
109c0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
109d0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
109e0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
109f0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
10a00 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
10a10 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
10a20 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
10a30 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
10a40 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10a50 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
10a60 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
10a70 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
10a80 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
10a90 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
10aa0 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
10ab0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  kingContext;..  
10ac0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
10ad0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
10ae0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
10af0 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63  d pid=%d (dotloc
10b00 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
10b10 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20   eFileLock,..   
10b20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10b30 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
10b40 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
10b50 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
10b60 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
10b70 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
10b80 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
10b90 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
10ba0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10bb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
10bc0 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65   /* To downgrade
10bd0 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70   to shared, simp
10be0 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  ly update our in
10bf0 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66  ternal notion of
10c00 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73   the.  ** lock s
10c10 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74  tate.  No need t
10c20 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20  o mess with the 
10c30 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
10c40 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
10c50 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
10c60 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
10c70 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
10c80 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
10c90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10ca0 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c  .  .  /* To full
10cb0 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  y unlock the dat
10cc0 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68  abase, delete th
10cd0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  e lock file */. 
10ce0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
10cf0 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  ck==NO_LOCK );. 
10d00 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c   if( osUnlink(zL
10d10 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  ockFile) ){.    
10d20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20 20  int rc = 0;.    
10d30 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
10d40 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45  no;.    if( ENOE
10d50 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  NT != tErrno ){.
10d60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10d70 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
10d80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
10d90 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
10da0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
10db0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
10dc0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
10dd0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
10de0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10df0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
10e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10e10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10e20 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72   file.  Make sur
10e30 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
10e40 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66  een released bef
10e50 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a  ore closing..*/.
10e60 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
10e70 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
10e80 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
10e90 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29  t rc;.  if( id )
10ea0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
10eb0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10ec0 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f  e*)id;.    dotlo
10ed0 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
10ee0 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74  LOCK);.    sqlit
10ef0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
10f00 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
10f10 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65    }.  rc = close
10f20 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
10f30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a  return rc;.}./**
10f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f50 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d   End of the dot-
10f60 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  file lock implem
10f70 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
10f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11040 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66  ******** Begin f
11050 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  lock Locking ***
11060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11080 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63  .** Use the floc
11090 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  k() system call 
110a0 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  to do file locki
110b0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  ng..**.** flock(
110c0 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  ) locking is lik
110d0 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69  e dot-file locki
110e0 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76  ng in that the v
110f0 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67  arious.** fine-g
11100 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  rain locking lev
11110 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  els supported by
11120 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c   SQLite are coll
11130 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20  apsed into.** a 
11140 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65  single exclusive
11150 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72   lock.  In other
11160 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20   words, SHARED, 
11170 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a  RESERVED, and.**
11180 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61   PENDING locks a
11190 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  re the same thin
111a0 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56  g as an EXCLUSIV
111b0 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a  E lock.  SQLite.
111c0 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77  ** still works w
111d0 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c  hen you do this,
111e0 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79   but concurrency
111f0 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63   is reduced sinc
11200 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e.** only a sing
11210 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62  le process can b
11220 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  e reading the da
11230 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65  tabase at a time
11240 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69  ..**.** Omit thi
11250 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c  s section if SQL
11260 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
11270 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e  NG_STYLE is turn
11280 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20  ed off or if.** 
11290 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58  compiling for VX
112a0 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51  WORKS..*/.#if SQ
112b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
112c0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
112d0 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
112e0 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61  Retry flock() ca
112f0 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69  lls that fail wi
11300 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64  th EINTR.*/.#ifd
11310 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20  ef EINTR.static 
11320 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  int robust_flock
11330 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29  (int fd, int op)
11340 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
11350 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c  { rc = flock(fd,
11360 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  op); }while( rc<
11370 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
11380 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
11390 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
113a0 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  ne robust_flock(
113b0 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a  a,b) flock(a,b).
113c0 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a  #endif.     ../*
113d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
113e0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
113f0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
11400 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
11410 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
11420 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
11430 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
11440 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
11450 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
11460 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
11470 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
11480 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
11490 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
114a0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
114b0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
114c0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
114d0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
114e0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
114f0 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
11500 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
11510 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
11520 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11530 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
11540 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11550 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
11560 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
11570 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11580 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
11590 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
115a0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
115b0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
115c0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
115d0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
115e0 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
115f0 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
11600 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
11610 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
11620 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11630 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
11640 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
11650 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
11660 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
11670 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
11680 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
11690 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
116a0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
116b0 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
116c0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
116d0 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f  nt lrc = robust_
116e0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
116f0 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
11700 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
11710 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
11720 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
11730 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
11740 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
11750 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
11760 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
11770 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
11780 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
11790 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
117a0 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
117b0 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  h an error */.  
117c0 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
117d0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
117e0 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53   .        if( IS
117f0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
11800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
11810 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11820 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
11830 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
11840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11850 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
11860 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
11870 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
11880 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
11890 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
118a0 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
118b0 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
118c0 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
118d0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
118e0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
118f0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
11900 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11910 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
11920 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11930 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11940 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
11950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11960 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
11970 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11980 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  %d %d (flock)\n"
11990 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
119a0 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66  reserved));..#if
119b0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
119c0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
119d0 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
119e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
119f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
11a00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11a10 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
11a20 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
11a30 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
11a40 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
11a50 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
11a60 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
11a70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11a80 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
11a90 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
11aa0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
11ab0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
11ac0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
11ad0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
11ae0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
11af0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
11b00 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
11b10 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
11b20 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
11b30 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
11b40 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
11b50 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
11b60 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
11b70 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
11b80 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
11b90 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
11ba0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
11bb0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
11bc0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
11bd0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
11be0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
11bf0 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
11c00 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
11c10 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
11c20 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
11c30 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
11c40 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
11c50 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
11c60 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
11c70 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
11c80 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
11c90 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
11ca0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
11cb0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
11cc0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
11cd0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
11ce0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
11cf0 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
11d00 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11d10 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
11d20 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
11d30 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e  **.** flock() on
11d40 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
11d50 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
11d60 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
11d70 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
11d80 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
11d90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
11da0 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
11db0 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
11dc0 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
11dd0 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
11de0 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
11df0 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
11e00 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
11e10 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
11e20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11e30 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11e40 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11e50 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11e60 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
11e70 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
11e80 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
11e90 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f  atic int flockLo
11ea0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11eb0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
11ec0 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
11ed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
11ee0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11ef0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
11f00 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11f10 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  );..  /* if we a
11f20 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
11f30 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
11f40 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
11f50 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
11f60 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
11f70 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
11f80 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11f90 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
11fa0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11fb0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
11fc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11fd0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
11fe0 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
11ff0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20  ve lock */.  .  
12000 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if (robust_flock
12010 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
12020 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b  EX | LOCK_NB)) {
12030 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
12040 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20  = errno;.    /* 
12050 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74  didn't get, must
12060 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20   be busy */.    
12070 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
12080 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
12090 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
120a0 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  ERR_LOCK);.    i
120b0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
120c0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
120d0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
120e0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
120f0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
12100 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
12110 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
12120 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
12130 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
12140 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f  ileLock;.  }.  O
12150 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
12160 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b   %d %s %s (flock
12170 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12180 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
12190 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
121a0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
121b0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
121c0 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  d"));.#ifdef SQL
121d0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
121e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
121f0 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
12200 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
12210 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
12220 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
12230 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
12240 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
12250 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
12260 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12270 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
12280 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12290 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
122a0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
122b0 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
122c0 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
122d0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
122e0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
122f0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
12300 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
12310 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
12320 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
12330 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
12340 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
12350 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
12360 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
12370 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
12380 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
12390 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
123a0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
123b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
123c0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
123d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
123e0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
123f0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
12400 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f  s %d pid=%d (flo
12410 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
12420 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
12430 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
12440 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
12450 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
12460 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
12470 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
12480 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
12490 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
124a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
124b0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
124c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
124d0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
124e0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
124f0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
12500 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
12510 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
12520 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
12530 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
12540 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12550 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12570 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12580 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
12590 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62  ck. */.  if( rob
125a0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
125b0 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a  >h, LOCK_UN) ){.
125c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
125d0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
125e0 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72  ERRORS.    retur
125f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
12600 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
12610 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
12620 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65  ERRORS */.    re
12630 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12640 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  R_UNLOCK;.  }els
12650 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  e{.    pFile->eF
12660 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
12670 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
12680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
12690 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
126a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
126b0 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
126c0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
126d0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
126e0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
126f0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20   NO_LOCK);.  }. 
12700 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
12710 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65  xFile(id);.}..#e
12720 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
12730 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12740 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
12750 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K */../*********
12760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
12770 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b  f the flock lock
12780 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127f0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
12860 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61  Begin Named Sema
12870 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  phore Locking **
12880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12890 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d  ******.**.** Nam
128a0 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
128b0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70  king is only sup
128c0 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b  ported on VxWork
128d0 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  s..**.** Semapho
128e0 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  re locking is li
128f0 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20  ke dot-lock and 
12900 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74  flock in that it
12910 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20   really only.** 
12920 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49  supports EXCLUSI
12930 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c  VE locking.  Onl
12940 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
12950 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
12960 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  rite.** the data
12970 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74  base file at a t
12980 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63  ime.  This reduc
12990 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e  es potential con
129a0 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a  currency, but.**
129b0 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20   makes the lock 
129c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
129d0 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23  uch easier..*/.#
129e0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  if OS_VXWORKS../
129f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12a00 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
12a10 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
12a20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
12a30 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
12a40 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
12a50 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
12a60 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
12a70 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
12a80 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
12a90 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
12aa0 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
12ab0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
12ac0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
12ad0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
12ae0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
12af0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
12b00 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
12b10 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
12b20 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b  tic int semCheck
12b30 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
12b40 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12b50 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
12b60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12b70 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
12b80 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
12b90 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12ba0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
12bb0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
12bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
12bd0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
12be0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
12bf0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
12c00 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
12c10 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
12c20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
12c30 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
12c40 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
12c50 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
12c60 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
12c70 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
12c80 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
12c90 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
12ca0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
12cb0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
12cc0 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a  d ){.    sem_t *
12cd0 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
12ce0 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20  node->pSem;.    
12cf0 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
12d00 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20 73 65  Buf;..    if( se
12d10 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
12d20 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =-1 ){.      int
12d30 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12d40 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41 49  .      if( EAGAI
12d50 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  N != tErrno ){. 
12d60 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12d70 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
12d80 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
12d90 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
12da0 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
12db0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
12dc0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
12dd0 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
12de0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  .        /* some
12df0 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65  one else has the
12e00 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72   lock when we ar
12e10 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a  e in NO_LOCK */.
12e20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
12e30 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65   = (pFile->eFile
12e40 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f  Lock < SHARED_LO
12e50 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
12e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
12e70 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69   we could have i
12e80 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20  t if we want it 
12e90 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73  */.      sem_pos
12ea0 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  t(pSem);.    }. 
12eb0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
12ec0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
12ed0 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d %d (sem)\n", p
12ee0 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
12ef0 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
12f00 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
12f10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12f20 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
12f30 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
12f40 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
12f50 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
12f60 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
12f70 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
12f80 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
12f90 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
12fa0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
12fb0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
12fc0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
12fd0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
12fe0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
12ff0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
13000 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
13010 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
13020 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
13030 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
13040 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
13050 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
13060 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
13070 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
13080 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
13090 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
130a0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
130b0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
130c0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
130d0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
130e0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
130f0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
13100 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
13110 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
13120 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
13130 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
13140 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
13150 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13160 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
13170 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
13180 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
13190 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
131a0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
131b0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
131c0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
131d0 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  IVE.**.** Semaph
131e0 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72  ore locks only r
131f0 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
13200 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
13210 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
13220 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
13230 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
13240 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
13250 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
13260 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
13270 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
13280 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
13290 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
132a0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
132b0 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
132c0 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
132d0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
132e0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
132f0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
13300 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
13310 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
13320 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
13330 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
13340 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c   int semLock(sql
13350 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13360 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13370 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13380 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13390 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73  d;.  int fd;.  s
133a0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
133b0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
133c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
133d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
133e0 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
133f0 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
13400 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
13410 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
13420 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
13430 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
13440 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
13450 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
13460 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
13470 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
13480 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ck;.    rc = SQL
13490 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
134a0 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
134b0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20   }.  .  /* lock 
134c0 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75  semaphore now bu
134d0 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20  t bail out when 
134e0 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20  already locked. 
134f0 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79  */.  if( sem_try
13500 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
13510 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13520 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
13530 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
13540 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c   }..  /* got it,
13550 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
13560 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
13570 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13580 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a  k = eFileLock;..
13590 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20   sem_end_lock:. 
135a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
135b0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
135c0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
135d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
135e0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
135f0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
13600 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
13610 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
13620 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
13630 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
13640 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
13650 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
13660 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
13670 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
13680 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
13690 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
136a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
136b0 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f  atic int semUnlo
136c0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
136d0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
136e0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
136f0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13700 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
13710 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
13720 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
13730 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
13740 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
13750 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
13760 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
13770 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
13780 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
13790 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70  eFileLock,..   p
137a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
137b0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
137c0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
137d0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
137e0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
137f0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
13800 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13810 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
13820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13830 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
13840 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
13850 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
13860 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
13870 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
13880 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
13890 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
138a0 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
138b0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
138c0 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
138d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
138e0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
138f0 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  y unlock. */.  i
13900 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65  f ( sem_post(pSe
13910 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  m)==-1 ) {.    i
13920 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20  nt rc, tErrno = 
13930 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
13940 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13950 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13960 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
13970 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
13980 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
13990 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
139a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
139b0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
139c0 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
139d0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
139e0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
139f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13a00 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
13a10 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
13a20 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73  atic int semClos
13a30 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
13a40 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
13a50 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
13a60 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13a70 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e  e*)id;.    semUn
13a80 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
13a90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
13aa0 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78  File );.    unix
13ab0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
13ac0 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
13ad0 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75  fo(pFile);.    u
13ae0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
13af0 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69  .    closeUnixFi
13b00 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
13b10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13b20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
13b30 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a  VXWORKS */./*.**
13b40 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
13b50 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
13b60 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78   available on Vx
13b70 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  Works..**.******
13b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
13b90 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
13ba0 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  hore lock implem
13bb0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
13bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
13bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c10 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
13c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c80 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46  ******* Begin AF
13c90 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  P Locking ******
13ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
13cc0 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70  * AFP is the App
13cd0 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63  le Filing Protoc
13ce0 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65  ol.  AFP is a ne
13cf0 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d  twork filesystem
13d00 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70   found.** on App
13d10 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d  le Macintosh com
13d20 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53  puters - both OS
13d30 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a  9 and OSX..**.**
13d40 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70   Third-party imp
13d50 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
13d60 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c  AFP are availabl
13d70 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64  e.  But this cod
13d80 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77  e here.** only w
13d90 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a  orks on OSX..*/.
13da0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
13db0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
13dc0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
13dd0 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _STYLE./*.** The
13de0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13df0 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
13e00 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
13e10 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
13e20 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
13e30 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
13e40 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67  ntext afpLocking
13e50 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
13e60 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
13e70 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  t {.  int reserv
13e80 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed;.  const char
13e90 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
13ea0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
13eb0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
13ec0 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74  /.};..struct Byt
13ed0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a  eRangeLockPB2.{.
13ee0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13ef0 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20  long offset;    
13f00 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f      /* offset to
13f10 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c   first byte to l
13f20 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
13f30 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
13f40 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62  th;        /* nb
13f50 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
13f60 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
13f70 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61   long long retRa
13f80 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72  ngeStart; /* nbr
13f90 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63   of 1st byte loc
13fa0 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ked if successfu
13fb0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
13fc0 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b  char unLockFlag;
13fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20           /* 1 = 
13fe0 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b  unlock, 0 = lock
13ff0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
14000 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67  har startEndFlag
14010 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c  ;       /* 1=rel
14020 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c   to end of fork,
14030 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20   0=rel to start 
14040 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14060 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64         /* file d
14070 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69  esc to assoc thi
14080 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d  s lock with */.}
14090 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73  ;..#define afpfs
140a0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
140b0 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52  CTL        _IOWR
140c0 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
140d0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
140e0 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  2)../*.** This i
140f0 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20  s a utility for 
14100 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72  setting or clear
14110 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20  ing a bit-range 
14120 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46  lock on an.** AF
14130 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a  P filesystem..**
14140 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49   .** Return SQLI
14150 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
14160 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e  , SQLITE_BUSY on
14170 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
14180 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f  tic int afpSetLo
14190 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
141a0 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20   *path,         
141b0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
141c0 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
141d0 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65  ocked or unlocke
141e0 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  d */.  unixFile 
141f0 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
14200 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
14210 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
14220 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67   path */.  unsig
14230 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
14240 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72  fset,     /* Fir
14250 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
14260 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cked */.  unsign
14270 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
14280 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  gth,     /* Numb
14290 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
142a0 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74  ock */.  int set
142b0 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20  LockFlag        
142c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
142d0 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61  to set lock.  Fa
142e0 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63  lse to clear loc
142f0 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
14300 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
14310 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b  2 pb;.  int err;
14320 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46  .  .  pb.unLockF
14330 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61  lag = setLockFla
14340 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e  g ? 0 : 1;.  pb.
14350 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30  startEndFlag = 0
14360 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20  ;.  pb.offset = 
14370 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e  offset;.  pb.len
14380 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20  gth = length; . 
14390 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e   pb.fd = pFile->
143a0 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28  h;.  .  OSTRACE(
143b0 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73  ("AFPSETLOCK [%s
143c0 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61  ] for %d%s in ra
143d0 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22  nge %llx:%llx\n"
143e0 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46  , .    (setLockF
143f0 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c  lag?"ON":"OFF"),
14400 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66   pFile->h, (pb.f
14410 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d  d==-1?"[testval-
14420 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66  1]":""),.    off
14430 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20  set, length));. 
14440 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
14450 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
14460 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
14470 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
14480 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
14490 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72   rc;.    int tEr
144a0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
144b0 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
144c0 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20  TLOCK failed to 
144d0 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20  fsctl() '%s' %d 
144e0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
144f0 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f      path, tErrno
14500 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e  , strerror(tErrn
14510 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  o)));.#ifdef SQL
14520 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
14530 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
14540 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
14550 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
14560 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14570 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14590 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61        setLockFla
145a0 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  g ? SQLITE_IOERR
145b0 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49  _LOCK : SQLITE_I
145c0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
145d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
145e0 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
145f0 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28  RRORS */.    if(
14600 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
14610 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
14620 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
14630 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
14640 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
14650 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
14660 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14680 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
14690 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
146a0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
146b0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
146c0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
146d0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
146e0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
146f0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
14700 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
14710 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
14720 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
14730 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
14740 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
14750 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
14760 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
14770 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
14780 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
14790 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
147a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
147b0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
147c0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
147d0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
147e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
147f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
14800 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
14810 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14820 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14830 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
14840 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
14850 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14860 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
14870 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14880 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
14890 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
148a0 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
148b0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
148c0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
148d0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
148e0 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
148f0 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
14900 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
14910 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14920 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
14930 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
14940 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
14950 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
14960 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a  s threads */.  .
14970 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
14980 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
14990 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
149a0 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
149b0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
149c0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
149d0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
149e0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
149f0 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
14a00 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
14a10 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
14a20 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66  s it..   */.  if
14a30 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
14a40 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52     /* lock the R
14a50 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a  ESERVED byte */.
14a60 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66      int lrc = af
14a70 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
14a80 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
14a90 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
14aa0 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20  1,1);  .    if( 
14ab0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29  SQLITE_OK==lrc )
14ac0 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
14ad0 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61   succeeded in ta
14ae0 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65  king the reserve
14af0 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  d lock, unlock i
14b00 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20  t to restore.   
14b10 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
14b20 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  al state */.    
14b30 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f    lrc = afpSetLo
14b40 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
14b50 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
14b60 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
14b70 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
14b80 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69      /* if we fai
14b90 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c  led to get the l
14ba0 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65  ock then someone
14bb0 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20   else must have 
14bc0 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65  it */.      rese
14bd0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
14be0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
14bf0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
14c00 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20      rc=lrc;.    
14c10 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
14c20 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
14c30 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
14c40 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
14c50 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
14c60 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
14c70 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74  );.  .  *pResOut
14c80 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
14c90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14ca0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
14cb0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
14cc0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
14cd0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
14ce0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
14cf0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
14d00 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
14d10 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
14d20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
14d30 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
14d40 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
14d50 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
14d60 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
14d70 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
14d80 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
14d90 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
14da0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
14db0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
14dc0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
14dd0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
14de0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
14df0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
14e00 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
14e10 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
14e20 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
14e30 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
14e40 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
14e50 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
14e60 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
14e70 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
14e80 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
14e90 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
14ea0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
14eb0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
14ec0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
14ed0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
14ee0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
14ef0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14f00 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14f10 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
14f20 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
14f30 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
14f40 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
14f50 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14f60 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
14f70 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
14f80 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
14f90 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
14fa0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
14fb0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
14fc0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c  .static int afpL
14fd0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
14fe0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
14ff0 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
15000 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
15010 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
15020 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
15030 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
15040 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
15050 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
15060 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
15070 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
15080 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
15090 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
150a0 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  xt;.  .  assert(
150b0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
150c0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
150d0 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
150e0 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
150f0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
15100 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
15110 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
15120 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
15130 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
15140 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
15150 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  ck(pInode->eFile
15160 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e  Lock), pInode->n
15170 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
15180 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
15190 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
151a0 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
151b0 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
151c0 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
151d0 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
151e0 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
151f0 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c  se the afp_end_l
15200 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
15210 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
15220 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
15230 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
15240 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
15250 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
15260 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
15270 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
15280 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
15290 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e  dy held) (afp)\n
152a0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
152b0 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
152c0 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
152d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
152e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
152f0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
15300 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
15310 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  is correct.  ** 
15320 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
15330 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
15340 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
15350 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
15360 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
15370 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
15380 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
15390 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
153a0 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
153b0 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
153c0 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
153d0 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
153e0 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
153f0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
15400 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
15410 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
15420 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
15430 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
15440 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
15450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
15460 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
15470 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
15480 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
15490 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
154a0 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
154b0 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
154c0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
154d0 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
154e0 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
154f0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
15500 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
15510 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
15520 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
15530 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
15540 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
15550 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
15560 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
15570 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
15580 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
15590 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
155a0 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
155b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
155c0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
155d0 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64  & .       (pInod
155e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
155f0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
15600 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
15610 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20  OCK)).     ){.  
15620 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
15630 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  SY;.    goto afp
15640 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
15650 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52   .  /* If a SHAR
15660 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
15670 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
15680 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
15690 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
156a0 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
156b0 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
156c0 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
156d0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
156e0 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
156f0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
15700 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
15710 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
15720 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e   .     (pInode->
15730 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15740 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
15750 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
15760 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
15770 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
15780 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
15790 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
157a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
157b0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
157c0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
157d0 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
157e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
157f0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
15800 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
15810 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
15820 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
15830 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
15840 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20    }.    .  /* A 
15850 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
15860 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
15870 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
15880 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
15890 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
158a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
158b0 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
158c0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
158d0 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
158e0 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
158f0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
15900 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
15910 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
15920 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
15930 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
15940 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
15950 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
15960 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
15970 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
15980 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
15990 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
159a0 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
159b0 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
159c0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
159d0 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
159e0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
159f0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
15a00 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
15a10 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
15a20 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
15a30 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
15a40 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
15a50 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
15a60 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
15a70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
15a80 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15a90 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  OCK ){.    int l
15aa0 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45  rc1, lrc2, lrc1E
15ab0 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f  rrno = 0;.    lo
15ac0 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20  ng lk, mask;.   
15ad0 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49   .    assert( pI
15ae0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
15af0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15b00 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
15b10 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
15b20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a  .    mask = (siz
15b30 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20  eof(long)==8) ? 
15b40 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20  LARGEST_INT64 : 
15b50 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20  0x7fffffff;.    
15b60 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
15b70 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f  ead-lock SHARED_
15b80 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e  LOCK */.    /* n
15b90 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61  ote that the qua
15ba0 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64  lity of the rand
15bb0 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d  omness doesn't m
15bc0 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20  atter that much 
15bd0 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64  */.    lk = rand
15be0 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64  om(); .    pInod
15bf0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20  e->sharedByte = 
15c00 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41  (lk & mask)%(SHA
15c10 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20  RED_SIZE - 1);. 
15c20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74     lrc1 = afpSet
15c30 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
15c40 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
15c50 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
15c60 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
15c70 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  redByte, 1, 1);.
15c80 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15c90 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20  ERROR(lrc1) ){. 
15ca0 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d       lrc1Errno =
15cb0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15cc0 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  o;.    }.    /* 
15cd0 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
15ce0 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
15cf0 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66  */.    lrc2 = af
15d00 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
15d10 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
15d20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
15d30 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69  , 0);.    .    i
15d40 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15d50 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20  (lrc1) ) {.     
15d60 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15d70 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20  o = lrc1Errno;. 
15d80 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
15d90 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
15da0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
15db0 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f  lse if( IS_LOCK_
15dc0 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20  ERROR(lrc2) ){. 
15dd0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a       rc = lrc2;.
15de0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
15df0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
15e00 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20  lse if( lrc1 != 
15e10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
15e20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
15e30 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
15e40 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
15e50 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
15e60 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
15e70 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
15e80 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d  Inode->nShared =
15e90 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
15ea0 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
15eb0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
15ec0 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  && pInode->nShar
15ed0 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ed>1 ){.    /* W
15ee0 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
15ef0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
15f00 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
15f10 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
15f20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
15f30 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
15f40 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
15f50 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
15f60 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
15f70 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
15f80 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
15f90 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
15fa0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
15fb0 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
15fc0 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
15fd0 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
15fe0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
15ff0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
16000 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
16010 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
16020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  ;.    assert( 0!
16030 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
16040 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69  k );.    if (eFi
16050 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56  leLock >= RESERV
16060 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  ED_LOCK && pFile
16070 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45  ->eFileLock < RE
16080 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
16090 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72         /* Acquir
160a0 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
160b0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  k */.        fai
160c0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
160d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
160e0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
160f0 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20  D_BYTE, 1,1);.  
16100 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20      if( !failed 
16110 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  ){.        conte
16120 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31  xt->reserved = 1
16130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16140 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20      if (!failed 
16150 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20  && eFileLock == 
16160 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
16170 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69  {.      /* Acqui
16180 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
16190 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
161a0 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  .      /* Remove
161b0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
161c0 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   before trying t
161d0 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c  he range.  we'll
161e0 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20   need to .      
161f0 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  ** reestablish t
16200 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
16210 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74  f we can't get t
16220 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20  he  afpUnlock.  
16230 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16240 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53   !(failed = afpS
16250 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16260 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
16270 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16290 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73         pInode->s
162a0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29  haredByte, 1, 0)
162b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
162c0 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54   failed2 = SQLIT
162d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a  E_OK;.        /*
162e0 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f   now attemmpt to
162f0 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
16300 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  ve lock range */
16310 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
16320 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16330 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16340 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
16350 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  T, .            
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
16380 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
16390 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65  failed && (faile
163a0 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  d2 = afpSetLock(
163b0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
163c0 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70  SHARED_FIRST + p
163f0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
16400 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20  e, 1, 1)) ){.   
16410 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20         /* Can't 
16420 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
16430 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71  shared lock.  Sq
16440 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c  lite can't deal,
16450 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
16460 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c     ** a critical
16470 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20   I/O error.     
16480 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16490 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20    rc = ((failed 
164a0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
164b0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
164c0 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
164e0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
164f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
16500 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
16510 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
16520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
16530 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
16540 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
16550 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
16560 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
16570 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
16580 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16590 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
165a0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
165b0 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
165c0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
165d0 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
165e0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
165f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
16600 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16610 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
16620 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
16630 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
16640 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
16650 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
16660 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
16670 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
16680 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
16690 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
166a0 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
166b0 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
166c0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
166d0 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
166e0 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
166f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
16700 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
16710 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
16720 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
16730 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
16740 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
16750 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
16760 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
16770 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
16780 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
16790 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
167a0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
167b0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
167c0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
167d0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
167e0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
167f0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
16800 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
16810 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
16820 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
16830 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16840 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
16850 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
16860 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
16870 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
16880 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
16890 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
168a0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
168b0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
168c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
168d0 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
168e0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
168f0 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
16900 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
16910 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
16920 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
16930 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
16940 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
16950 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
16960 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
16970 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
16980 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
16990 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
169a0 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
169b0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
169c0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  d,.           ge
169d0 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73  tpid()));..  ass
169e0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
169f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16a00 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
16a10 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
16a20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16a30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
16a40 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
16a50 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
16a60 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
16a70 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
16a80 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
16a90 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
16aa0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
16ab0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
16ac0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
16ad0 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
16ae0 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  k );.    Simulat
16af0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
16b00 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
16b10 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
16b20 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
16b30 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
16b40 20 20 20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42     .#ifndef NDEB
16b50 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
16b60 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
16b70 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
16b80 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
16b90 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
16ba0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
16bb0 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
16bc0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
16bd0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
16be0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
16bf0 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
16c00 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16c10 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
16c20 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
16c30 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
16c40 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
16c50 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
16c60 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
16c70 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
16c80 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
16c90 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
16ca0 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
16cb0 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
16cc0 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
16cd0 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
16ce0 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
16cf0 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
16d00 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
16d10 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
16d20 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
16d30 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
16d40 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
16d50 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
16d60 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
16d70 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
16d80 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
16d90 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
16da0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
16db0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
16dc0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
16dd0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
16de0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
16df0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
16e00 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16e10 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
16e20 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
16e30 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
16e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16e50 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
16e60 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
16e70 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
16e80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
16e90 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
16ea0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16eb0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
16ec0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
16ed0 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
16ee0 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
16ef0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
16f00 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
16f10 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16f20 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
16f30 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
16f40 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
16f50 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
16f60 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
16f70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16f80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16f90 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
16fa0 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
16fb0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
16fc0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16fd0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16fe0 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
16ff0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
17000 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17010 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
17020 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
17030 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
17040 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
17050 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
17060 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17070 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
17080 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
17090 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
170a0 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
170b0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
170c0 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
170d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
170e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
170f0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17100 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
17110 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
17120 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
17130 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
17140 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
17150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17160 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
17170 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
17180 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
17190 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
171a0 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
171b0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
171c0 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
171d0 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
171e0 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
171f0 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
17200 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
17210 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
17220 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
17230 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
17240 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
17250 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
17260 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
17270 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
17280 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
17290 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
172a0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
172b0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
172c0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
172d0 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
172e0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
172f0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
17300 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
17310 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
17320 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
17330 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17340 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
17350 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
17360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17370 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
17380 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
17390 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
173a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
173b0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
173c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
173d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
173e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
173f0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
17400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
17410 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
17420 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
17430 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
17440 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e          closePen
17450 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
17460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17470 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
17480 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
17490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
174a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
174b0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
174c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
174d0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
174e0 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
174f0 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
17500 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69  ontext .*/.stati
17510 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73  c int afpClose(s
17520 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
17530 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
17540 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
17550 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
17560 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
17570 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66  File*)id;.    af
17580 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
17590 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  OCK);.    unixEn
175a0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
175b0 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
175c0 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  e && pFile->pIno
175d0 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
175e0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
175f0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
17600 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
17610 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
17620 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
17630 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
17640 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
17650 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
17660 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
17670 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
17680 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
17690 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
176a0 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
176b0 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
176c0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
176d0 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
176e0 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
176f0 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
17700 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
17710 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
17720 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
17730 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
17740 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
17750 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ext);.    rc = c
17760 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
17770 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
17780 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
17790 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
177a0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
177b0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
177c0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
177d0 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
177e0 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
177f0 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  is the AFP lock 
17800 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
17810 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
17820 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
17830 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
17840 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
17850 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
17860 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
17870 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
17880 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d  If you don't com
17890 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20  pile for a mac, 
178a0 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61  then the "unix-a
178b0 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f  fp".** VFS is no
178c0 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  t available..**.
178d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178e0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
178f0 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
17900 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
17910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
17970 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
17980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179c0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
179d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
179e0 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a  in NFS Locking *
179f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
17a10 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
17a20 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
17a30 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
17a40 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c  G_STYLE./*. ** L
17a50 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
17a60 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
17a70 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
17a80 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
17a90 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73  FileLock. ** mus
17aa0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
17ab0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
17ac0 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74  CK.. **. ** If t
17ad0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17ae0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
17af0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
17b00 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20  dy at or below. 
17b10 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
17b20 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
17b30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17b40 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61  a no-op.. */.sta
17b50 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63  tic int nfsUnloc
17b60 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
17b70 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
17b80 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  k){.  return pos
17b90 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
17ba0 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23  leLock, 1);.}..#
17bb0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
17bc0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
17bd0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
17be0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
17bf0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
17c00 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f  ve is the NFS lo
17c10 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
17c20 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
17c30 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
17c40 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
17c50 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
17c60 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
17c70 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
17c80 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
17c90 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  .**.*********
17ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
17cb0 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   of the NFS lock
17cc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
17cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ce0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
17cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d30 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
17d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d80 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
17d90 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
17da0 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
17db0 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
17dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17dd0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
17de0 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
17df0 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
17e00 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
17e10 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
17e20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
17e30 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
17e40 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
17e50 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
17e60 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
17e70 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
17e80 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
17e90 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
17ea0 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
17eb0 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
17ec0 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
17ed0 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
17ee0 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
17ef0 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
17f00 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
17f10 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
17f20 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
17f30 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
17f40 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
17f50 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
17f60 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
17f70 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
17f80 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
17f90 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
17fa0 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
17fb0 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
17fc0 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
17fd0 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
17fe0 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
17ff0 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
18000 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
18010 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
18020 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
18030 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
18040 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
18050 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
18060 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e   USE_PREAD.** an
18070 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65  y any form by de
18080 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e  fault, we will n
18090 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ot attempt to de
180a0 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
180b0 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65  CE..** See ticke
180c0 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36  ts #2741 and #26
180d0 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  81..**.** To avo
180e0 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
180f0 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
18100 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65   failed read the
18110 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
18120 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
18130 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
18140 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
18150 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20  ndRead(unixFile 
18160 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
18170 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20  64 offset, void 
18180 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
18190 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20  .  int got;.#if 
181a0 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
181b0 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
181c0 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
181d0 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
181e0 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
181f0 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
18200 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64  d(USE_PREAD).  d
18210 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64  o{ got = osPread
18220 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18230 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69  t, offset); }whi
18240 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
18250 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 53  no==EINTR );.  S
18260 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18270 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69  got = -1 );.#eli
18280 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
18290 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74  EAD64).  do{ got
182a0 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d   = osPread64(id-
182b0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
182c0 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20  ffset); }while( 
182d0 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
182e0 45 49 4e 54 52 29 3b 0a 20 20 53 69 6d 75 6c 61  EINTR);.  Simula
182f0 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
18300 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e   -1 );.#else.  n
18310 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
18320 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
18330 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d  SEEK_SET);.  Sim
18340 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65  ulateIOError( ne
18350 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69  wOffset-- );.  i
18360 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
18370 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20  fset ){.    if( 
18380 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20  newOffset == -1 
18390 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  ){.      ((unixF
183a0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
183b0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
183c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28   }else{.      ((
183d0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
183e0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09  astErrno = 0;...
183f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
18400 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f 7b 20  n -1;.  }.  do{ 
18410 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d  got = osRead(id-
18420 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 20  >h, pBuf, cnt); 
18430 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
18440 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
18450 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
18460 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30  END;.  if( got<0
18470 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
18480 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
18490 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
184a0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
184b0 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c      %-3d %5d %7l
184c0 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e  ld %llu\n", id->
184d0 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20  h, got, offset, 
184e0 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
184f0 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
18500 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
18510 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
18520 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
18530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
18540 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
18550 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
18560 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
18570 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
18580 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
18590 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
185a0 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69  unixRead(.  sqli
185b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
185c0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
185d0 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
185e0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a  e3_int64 offset.
185f0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
18600 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18610 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74   *)id;.  int got
18620 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
18630 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
18640 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
18650 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
18660 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
18670 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
18680 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
18690 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
186a0 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
186b0 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
186c0 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
186d0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
186e0 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  pUnused==0.     
186f0 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
18700 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
18710 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
18720 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
18730 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20   .  );.#endif.. 
18740 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
18750 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  ad(pFile, offset
18760 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
18770 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
18780 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18790 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
187a0 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f  ( got<0 ){.    /
187b0 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
187c0 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
187d0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
187e0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
187f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
18800 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
18810 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  0; /* not a syst
18820 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
18830 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
18840 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
18850 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
18860 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
18870 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
18880 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
18890 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
188a0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
188b0 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
188c0 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
188d0 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
188e0 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
188f0 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
18900 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
18910 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18920 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
18930 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
18940 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  et..**.** To avo
18950 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
18960 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
18970 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68   failed write th
18980 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
18990 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
189a0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
189b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
189c0 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
189d0 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
189e0 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
189f0 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
18a00 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21   int got;.#if (!
18a10 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
18a20 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55  D) && !defined(U
18a30 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69  SE_PREAD64)).  i
18a40 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65  64 newOffset;.#e
18a50 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41  ndif.  TIMER_STA
18a60 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  RT;.#if defined(
18a70 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b  USE_PREAD).  do{
18a80 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 28   got = osPwrite(
18a90 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18aa0 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c  , offset); }whil
18ab0 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
18ac0 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69  o==EINTR );.#eli
18ad0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
18ae0 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74  EAD64).  do{ got
18af0 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28 69 64   = osPwrite64(id
18b00 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
18b10 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65 28 20  offset);}while( 
18b20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
18b30 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20  EINTR);.#else.  
18b40 64 6f 7b 0a 20 20 20 20 6e 65 77 4f 66 66 73 65  do{.    newOffse
18b50 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
18b60 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
18b70 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
18b80 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
18b90 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20  et-- );.    if( 
18ba0 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65  newOffset!=offse
18bb0 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  t ){.      if( n
18bc0 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29  ewOffset == -1 )
18bd0 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78  {.        ((unix
18be0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
18bf0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
18c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18c10 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
18c20 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
18c30 30 3b 09 09 09 0a 20 20 20 20 20 20 7d 0a 20 20  0;....      }.  
18c40 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
18c50 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
18c60 73 57 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42  sWrite(id->h, pB
18c70 75 66 2c 20 63 6e 74 29 3b 0a 20 20 7d 77 68 69  uf, cnt);.  }whi
18c80 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
18c90 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e  no==EINTR );.#en
18ca0 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  dif.  TIMER_END;
18cb0 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  .  if( got<0 ){.
18cc0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18cd0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
18ce0 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f   errno;.  }..  O
18cf0 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 20  STRACE(("WRITE  
18d00 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
18d10 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  %llu\n", id->h, 
18d20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
18d30 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20  ER_ELAPSED));.  
18d40 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a  return got;.}...
18d50 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
18d60 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
18d70 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
18d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
18d90 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
18da0 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
18db0 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
18dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
18dd0 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69  nixWrite(.  sqli
18de0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
18df0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
18e00 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
18e10 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
18e20 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78  ffset .){.  unix
18e30 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
18e40 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
18e50 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20  nt wrote = 0;.  
18e60 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
18e70 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
18e80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
18e90 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
18ea0 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
18eb0 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
18ec0 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
18ed0 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
18ee0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
18ef0 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
18f00 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
18f10 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ten. */.#if 0.  
18f20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
18f30 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20  Unused==0.      
18f40 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44   || offset>=PEND
18f50 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20  ING_BYTE+512.   
18f60 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d      || offset+am
18f70 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  t<=PENDING_BYTE 
18f80 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  .  );.#endif..#i
18f90 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
18fa0 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
18fb0 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
18fc0 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
18fd0 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
18fe0 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  to.  ** doing a 
18ff0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
19000 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
19010 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
19020 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e  er than a.  ** n
19030 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
19040 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64  ile) then record
19050 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
19060 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
19070 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49   has changed.  I
19080 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
19090 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64  n counter is mod
190a0 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68  ified, record th
190b0 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f  at.  ** fact too
190c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
190d0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
190e0 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
190f0 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f  dbUpdate = 1;  /
19100 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68  * The database h
19110 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
19120 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73   */.    if( offs
19130 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74  et<=24 && offset
19140 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20  +amt>=27 ){.    
19150 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
19160 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b  char oldCntr[4];
19170 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
19180 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
19190 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b  .      rc = seek
191a0 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32  AndRead(pFile, 2
191b0 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a  4, oldCntr, 4);.
191c0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
191d0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
191e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20        if( rc!=4 
191f0 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74  || memcmp(oldCnt
19200 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66  r, &((char*)pBuf
19210 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29  )[24-offset], 4)
19220 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
19230 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
19240 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  hng = 1;  /* The
19250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
19260 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64  nter has changed
19270 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
19280 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
19290 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20  while( amt>0 && 
192a0 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64  (wrote = seekAnd
192b0 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66  Write(pFile, off
192c0 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29  set, pBuf, amt))
192d0 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d  >0 ){.    amt -=
192e0 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73   wrote;.    offs
192f0 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20  et += wrote;.   
19300 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
19310 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
19320 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
19330 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31  rror(( wrote=(-1
19340 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53  ), amt=1 ));.  S
19350 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
19360 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20  rror(( wrote=0, 
19370 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28  amt=1 ));..  if(
19380 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66   amt>0 ){.    if
19390 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69  ( wrote<0 && pFi
193a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45  le->lastErrno!=E
193b0 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f  NOSPC ){.      /
193c0 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
193d0 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20  by seekAndWrite 
193e0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
193f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
19400 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
19410 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
19420 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
19430 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
19440 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
19450 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
19460 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
19470 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19480 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
19490 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
194a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
194b0 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
194c0 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
194d0 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
194e0 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
194f0 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
19500 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20  ccurring at the 
19510 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
19520 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
19530 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
19540 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
19550 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
19560 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20  if../*.** We do 
19570 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d  not trust system
19580 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77  s to provide a w
19590 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63  orking fdatasync
195a0 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a  ().  Some do..**
195b0 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20   Others do no.  
195c0 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77  To be safe, we w
195d0 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74  ill stick with t
195e0 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f  he (slightly slo
195f0 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e  wer).** fsync().
19600 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
19610 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
19620 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
19630 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
19640 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
19650 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
19660 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
19670 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ync.*/.#if !defi
19680 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 0a 23  ned(fdatasync).#
19690 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e   define fdatasyn
196a0 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a  c fsync.#endif..
196b0 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56  /*.** Define HAV
196c0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30  E_FULLFSYNC to 0
196d0 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20   or 1 depending 
196e0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
196f0 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46  t.** the F_FULLF
19700 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65  SYNC macro is de
19710 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53  fined.  F_FULLFS
19720 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79  YNC is currently
19730 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  .** only availab
19740 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20  le on Mac OS X. 
19750 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20   But that could 
19760 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  change..*/.#ifde
19770 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20  f F_FULLFSYNC.# 
19780 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
19790 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20  FSYNC 1.#else.# 
197a0 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
197b0 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a  FSYNC 0.#endif..
197c0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63  ./*.** The fsync
197d0 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64  () system call d
197e0 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20  oes not work as 
197f0 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61  advertised on ma
19800 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65  ny.** unix syste
19810 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ms.  The followi
19820 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  ng procedure is 
19830 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61  an attempt to ma
19840 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65  ke.** it work be
19850 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tter..**.** The 
19860 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d  SQLITE_NO_SYNC m
19870 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c  acro disables al
19880 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69  l fsync()s.  Thi
19890 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66  s is useful.** f
198a0 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20  or testing when 
198b0 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74  we want to run t
198c0 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20  hrough the test 
198d0 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a  suite quickly..*
198e0 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67  * You are strong
198f0 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a  ly advised *not*
19900 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20   to deploy with 
19910 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a  SQLITE_NO_SYNC.*
19920 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76  * enabled, howev
19930 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53  er, since with S
19940 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e  QLITE_NO_SYNC en
19950 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61  abled, an OS cra
19960 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  sh.** or power f
19970 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65  ailure will like
19980 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
19990 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
199a0 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20  .** SQLite sets 
199b0 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
199c0 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66  g if the size of
199d0 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63   the file is unc
199e0 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69  hanged..** The i
199f0 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f  dea behind dataO
19a00 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73  nly is that it s
19a10 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65  hould only write
19a20 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e   the file conten
19a30 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f  t.** to disk, no
19a40 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65  t the inode.  We
19a50 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e   only set dataOn
19a60 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ly if the file s
19a70 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61  ize is .** uncha
19a80 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66  nged since the f
19a90 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74  ile size is part
19aa0 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20   of the inode.  
19ab0 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64  However, .** Ted
19ac0 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74   Ts'o tells us t
19ad0 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
19ae0 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20  will also write 
19af0 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65  the inode if the
19b00 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61  .** file size ha
19b10 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20  s changed.  The 
19b20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72  only real differ
19b30 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61  ence between fda
19b40 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20  tasync().** and 
19b50 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c  fsync(), Ted tel
19b60 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66  ls us, is that f
19b70 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
19b80 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a  not flush the.**
19b90 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74   inode if the mt
19ba0 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20  ime or owner or 
19bb0 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72  other inode attr
19bc0 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e  ibutes have chan
19bd0 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20  ged..** We only 
19be0 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66  care about the f
19bf0 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68  ile size, not th
19c00 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74  e other file att
19c10 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61  ributes, so.** a
19c20 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20  s far as SQLite 
19c30 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e  is concerned, an
19c40 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20   fdatasync() is 
19c50 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e  always adequate.
19c60 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79  .** So, we alway
19c70 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28  s use fdatasync(
19c80 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c  ) if it is avail
19c90 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73  able, regardless
19ca0 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   of.** the value
19cb0 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79   of the dataOnly
19cc0 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   flag..*/.static
19cd0 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28   int full_fsync(
19ce0 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c  int fd, int full
19cf0 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e  Sync, int dataOn
19d00 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ly){.  int rc;..
19d10 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
19d20 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65  ng "ifdef/elif/e
19d30 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20  lse/" block has 
19d40 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75  the same structu
19d50 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f  re as.  ** the o
19d60 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20  ne below. It is 
19d70 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20  replicated here 
19d80 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20  solely to avoid 
19d90 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a  cluttering .  **
19da0 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64   up the real cod
19db0 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45  e with the UNUSE
19dc0 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61  D_PARAMETER() ma
19dd0 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  cros..  */.#ifde
19de0 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
19df0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19e00 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45  TER(fd);.  UNUSE
19e10 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
19e20 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
19e30 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
19e40 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  ly);.#elif HAVE_
19e50 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53  FULLFSYNC.  UNUS
19e60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
19e70 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20  aOnly);.#else.  
19e80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19e90 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
19ea0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
19eb0 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66  ataOnly);.#endif
19ec0 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
19ed0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
19ee0 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e  s that we do a n
19ef0 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e  ormal fsync() an
19f00 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43  d .  ** FULLSYNC
19f10 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
19f20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74  during testing t
19f30 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
19f40 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  is procedure.  *
19f50 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69  * gets called wi
19f60 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  th the correct a
19f70 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23  rguments..  */.#
19f80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
19f90 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  T.  if( fullSync
19fa0 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73   ) sqlite3_fulls
19fb0 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73  ync_count++;.  s
19fc0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
19fd0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
19fe0 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
19ff0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
1a000 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
1a010 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
1a020 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f  .  ** no-op.  */
1a030 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
1a040 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51  O_SYNC.  rc = SQ
1a050 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48  LITE_OK;.#elif H
1a060 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
1a070 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  if( fullSync ){.
1a080 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
1a090 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
1a0a0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1a0b0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
1a0c0 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
1a0d0 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
1a0e0 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
1a0f0 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
1a100 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
1a110 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
1a120 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
1a130 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
1a140 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
1a150 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
1a160 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
1a170 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
1a180 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
1a190 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
1a1a0 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
1a1b0 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
1a1c0 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
1a1d0 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
1a1e0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
1a1f0 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
1a200 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
1a210 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
1a220 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
1a230 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
1a240 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
1a250 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
1a260 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
1a270 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
1a280 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
1a290 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64  nc(fd);..#elif d
1a2a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1a2b0 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63  ).  /* fdatasync
1a2c0 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e  () on HFS+ doesn
1a2d0 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65  't yet flush the
1a2e0 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74   file size if it
1a2f0 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74   changed correct
1a300 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65  ly.  ** so curre
1a310 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20  ntly we default 
1a320 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61  to the macro tha
1a330 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74  t redefines fdat
1a340 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20  async to fsync. 
1a350 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63   */.  rc = fsync
1a360 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72  (fd);.#else .  r
1a370 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
1a380 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
1a390 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26  S.  if( rc==-1 &
1a3a0 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50  & errno==ENOTSUP
1a3b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79   ){.    rc = fsy
1a3c0 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
1a3d0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
1a3e0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66   */.#endif /* if
1a3f0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1a400 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
1a410 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
1a420 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
1a430 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
1a440 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1a450 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a460 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  Open a file desc
1a470 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69  riptor to the di
1a480 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1a490 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d  ng file zFilenam
1a4a0 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  e..** If success
1a4b0 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74  ful, *pFd is set
1a4c0 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
1a4d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
1a4e0 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
1a4f0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1a500 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1a510 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e   either SQLITE_N
1a520 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OMEM.** or SQLIT
1a530 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
1a540 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20  turned and *pFd 
1a550 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64  is set to an und
1a560 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e  efined.** value.
1a570 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65 63  .**.** The direc
1a580 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
1a590 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72  ptor is used for
1a5a0 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20   only one thing 
1a5b0 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20  - to.** fsync() 
1a5c0 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 6d  a directory to m
1a5d0 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63 72  ake sure file cr
1a5e0 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74  eation and delet
1a5f0 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72  ion events.** ar
1a600 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
1a610 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73 20  k.  Such fsyncs 
1a620 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f  are not needed o
1a630 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e  n newer.** journ
1a640 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d  aling filesystem
1a650 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75 69  s, but are requi
1a660 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c  red on older fil
1a670 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20  esystems..**.** 
1a680 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
1a690 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75   be overridden u
1a6a0 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79 73  sing the xSetSys
1a6b0 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a  Call interface..
1a6c0 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20 74  ** The ability t
1a6d0 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  o override this 
1a6e0 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64 65  routine was adde
1a6f0 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 20  d in support of 
1a700 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20  the.** chromium 
1a710 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e  sandbox.  Openin
1a720 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 73  g a directory is
1a730 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73 6b   a security risk
1a740 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64   (we are.** told
1a750 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f  ) so making it o
1a760 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f  verrideable allo
1a770 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d 20  ws the chromium 
1a780 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65  sandbox to.** re
1a790 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74 69  place this routi
1a7a0 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c 65  ne with a harmle
1a7b0 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61  ss no-op.  To ma
1a7c0 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ke this routine.
1a7d0 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c  ** a no-op, repl
1a7e0 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73 74  ace it with a st
1a7f0 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ub that returns 
1a800 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
1a810 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74  aves.** *pFd set
1a820 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20 6e   to a negative n
1a830 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  umber..**.** If 
1a840 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1a850 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  urned, the calle
1a860 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1a870 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20   for closing.** 
1a880 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1a890 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63  tor *pFd using c
1a8a0 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lose()..*/.stati
1a8b0 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
1a8c0 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ory(const char *
1a8d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a  zFilename, int *
1a8e0 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  pFd){.  int ii;.
1a8f0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
1a900 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d   char zDirname[M
1a910 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
1a920 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1a930 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
1a940 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22  , zDirname, "%s"
1a950 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1a960 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c  for(ii=(int)strl
1a970 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69  en(zDirname); ii
1a980 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69  >1 && zDirname[i
1a990 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a  i]!='/'; ii--);.
1a9a0 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20    if( ii>0 ){.  
1a9b0 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d    zDirname[ii] =
1a9c0 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20   '\0';.    fd = 
1a9d0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72  robust_open(zDir
1a9e0 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f  name, O_RDONLY|O
1a9f0 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20  _BINARY, 0);.   
1aa00 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69   if( fd>=0 ){.#i
1aa10 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a  fdef FD_CLOEXEC.
1aa20 20 20 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64        osFcntl(fd
1aa30 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e  , F_SETFD, osFcn
1aa40 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20  tl(fd, F_GETFD, 
1aa50 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29  0) | FD_CLOEXEC)
1aa60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f  ;.#endif.      O
1aa70 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52  STRACE(("OPENDIR
1aa80 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c   %-3d %s\n", fd,
1aa90 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20   zDirname));.   
1aaa0 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20   }.  }.  *pFd = 
1aab0 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64  fd;.  return (fd
1aac0 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e  >=0?SQLITE_OK:un
1aad0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1aae0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
1aaf0 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d   "open", zDirnam
1ab00 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  e));.}../*.** Ma
1ab10 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
1ab20 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
1ab30 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
1ab40 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
1ab50 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79  *.** If dataOnly
1ab60 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68  ==0 then both th
1ab70 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e  e file itself an
1ab80 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28  d its metadata (
1ab90 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63  file.** size, ac
1aba0 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20  cess time, etc) 
1abb0 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20  are synced.  If 
1abc0 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e  dataOnly!=0 then
1abd0 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c   only the.** fil
1abe0 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  e data is synced
1abf0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
1ac00 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
1ac10 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
1ac20 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1ac30 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
1ac40 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
1ac50 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
1ac60 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
1ac70 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
1ac80 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
1ac90 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
1aca0 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
1acb0 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
1acc0 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
1acd0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1ace0 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
1acf0 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
1ad00 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
1ad10 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
1ad20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
1ad30 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
1ad40 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
1ad50 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
1ad60 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1ad70 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
1ad80 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
1ad90 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
1ada0 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
1adb0 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
1adc0 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
1add0 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
1ade0 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
1adf0 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71   int unixSync(sq
1ae00 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1ae10 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
1ae20 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65  t rc;.  unixFile
1ae30 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1ae40 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20  ile*)id;..  int 
1ae50 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c  isDataOnly = (fl
1ae60 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ags&SQLITE_SYNC_
1ae70 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  DATAONLY);.  int
1ae80 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66   isFullsync = (f
1ae90 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1aea0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20  TE_SYNC_FULL;.. 
1aeb0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f   /* Check that o
1aec0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e  ne of SQLITE_SYN
1aed0 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c  C_NORMAL or FULL
1aee0 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20   was passed */. 
1aef0 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30   assert((flags&0
1af00 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1af10 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c  C_NORMAL.      |
1af20 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  | (flags&0x0F)==
1af30 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1af40 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  .  );..  /* Unix
1af50 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
1af60 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
1af70 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1af80 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
1af90 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
1afa0 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
1afb0 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
1afc0 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
1afd0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1afe0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
1aff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1b000 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  L );..  assert( 
1b010 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
1b020 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE(("SYNC    %-3
1b030 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
1b040 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73  ;.  rc = full_fs
1b050 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73  ync(pFile->h, is
1b060 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61  Fullsync, isData
1b070 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Only);.  Simulat
1b080 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1b090 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1b0a0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1b0b0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1b0c0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1b0d0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1b0e0 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73  _FSYNC, "full_fs
1b0f0 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
1b100 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  th);.  }..  /* A
1b110 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69  lso fsync the di
1b120 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1b130 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74  ng the file if t
1b140 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a  he DIRSYNC flag.
1b150 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68    ** is set.  Th
1b160 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65  is is a one-time
1b170 20 6f 63 63 75 72 72 61 6e 63 65 2e 20 20 4d 61   occurrance.  Ma
1b180 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d  ny systems (exam
1b190 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20  ples: AIX).  ** 
1b1a0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73  are unable to fs
1b1b0 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c  ync a directory,
1b1c0 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72   so ignore error
1b1d0 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a  s on the fsync..
1b1e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1b1f0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
1b200 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29  IXFILE_DIRSYNC )
1b210 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b  {.    int dirfd;
1b220 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
1b230 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f  IRSYNC %s (have_
1b240 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c  fullfsync=%d ful
1b250 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46  lsync=%d)\n", pF
1b260 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20  ile->zPath,.    
1b270 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c          HAVE_FUL
1b280 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79  LFSYNC, isFullsy
1b290 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f  nc));.    rc = o
1b2a0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
1b2b0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69  File->zPath, &di
1b2c0 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rfd);.    if( rc
1b2d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
1b2e0 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  irfd>=0 ){.     
1b2f0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66   full_fsync(dirf
1b300 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
1b310 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
1b320 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e  le, dirfd, __LIN
1b330 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E__);.    }else 
1b340 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
1b350 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
1b360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b370 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1b380 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1b390 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1b3a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1b3b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
1b3c0 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
1b3d0 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
1b3e0 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
1b3f0 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
1b400 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1b410 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
1b420 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1b430 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
1b440 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  d;.  int rc;.  a
1b450 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1b460 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b470 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1b480 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20  _IOERR_TRUNCATE 
1b490 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1b4a0 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
1b4b0 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
1b4c0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1b4d0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
1b4e0 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
1b4f0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
1b500 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
1b510 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
1b520 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
1b530 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
1b540 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
1b550 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
1b560 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
1b570 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
1b580 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1b590 68 75 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79 74  hunk ){.    nByt
1b5a0 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46  e = ((nByte + pF
1b5b0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31  ile->szChunk - 1
1b5c0 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  )/pFile->szChunk
1b5d0 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
1b5e0 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  nk;.  }..  rc = 
1b5f0 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1b600 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f  (pFile->h, (off_
1b610 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  t)nByte);.  if( 
1b620 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  rc ){.    pFile-
1b630 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1b640 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75  no;.    return u
1b650 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1b660 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1b670 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  E, "ftruncate", 
1b680 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1b690 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20   }else{.#ifndef 
1b6a0 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66  NDEBUG.    /* If
1b6b0 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1b6c0 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1b6d0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1b6e0 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1b6f0 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f     ** doing a ho
1b700 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1b710 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f  ck or a write to
1b720 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72   some file other
1b730 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e   than a.    ** n
1b740 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1b750 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e  ile) and we trun
1b760 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
1b770 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20   zero length,.  
1b780 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74    ** that effect
1b790 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74 68  ively updates th
1b7a0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1b7b0 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  .  This might ha
1b7c0 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e  ppen.    ** when
1b7d0 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74   restoring a dat
1b7e0 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
1b7f0 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20  backup API from 
1b800 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20  a zero-length.  
1b810 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20    ** source..   
1b820 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c   */.    if( pFil
1b830 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1b840 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a   && nByte==0 ){.
1b850 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1b860 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a  nsCntrChng = 1;.
1b870 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1b880 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b890 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
1b8a0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
1b8b0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
1b8c0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
1b8d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1b8e0 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
1b8f0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1b900 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
1b910 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
1b920 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
1b930 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
1b940 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
1b950 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
1b960 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b970 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1b980 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28 28   rc!=0 ){.    ((
1b990 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1b9a0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1b9b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1b9c0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1b9d0 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20  .  }.  *pSize = 
1b9e0 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20  buf.st_size;..  
1b9f0 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  /* When opening 
1ba00 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61  a zero-size data
1ba10 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e  base, the findIn
1ba20 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64  odeInfo() proced
1ba30 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20  ure.  ** writes 
1ba40 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
1ba50 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20  to that file in 
1ba60 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72  order to work ar
1ba70 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20  ound a bug.  ** 
1ba80 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f  in the OS-X msdo
1ba90 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49  s filesystem.  I
1baa0 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
1bab0 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75   problems with u
1bac0 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73  pper.  ** layers
1bad0 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70  , we need to rep
1bae0 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69  ort this file si
1baf0 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20  ze as zero even 
1bb00 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a  though it is.  *
1bb10 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69  * really 1.   Ti
1bb20 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f  cket #3260..  */
1bb30 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31  .  if( *pSize==1
1bb40 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a   ) *pSize = 0;..
1bb50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1bb60 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
1bb70 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1bb80 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1bb90 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
1bba0 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20  .** Handler for 
1bbb0 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69  proxy-locking fi
1bbc0 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73  le-control verbs
1bbd0 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77  .  Defined below
1bbe0 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79   in the.** proxy
1bbf0 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69  ing locking divi
1bc00 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
1bc10 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  int proxyFileCon
1bc20 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
1bc30 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23  e*,int,void*);.#
1bc40 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  endif../* .** Th
1bc50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1bc60 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  alled to handle 
1bc70 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
1bc80 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66  _SIZE_HINT .** f
1bc90 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72  ile-control oper
1bca0 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20  ation.  Enlarge 
1bcb0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
1bcc0 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a  nBytes in size.*
1bcd0 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  * (rounded up to
1bce0 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d   the next chunk-
1bcf0 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64  size).  If the d
1bd00 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
1bd10 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20  dy.** nBytes or 
1bd20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75  larger, this rou
1bd30 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1bd40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1bd50 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69  cntlSizeHint(uni
1bd60 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36  xFile *pFile, i6
1bd70 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20  4 nByte){.  if( 
1bd80 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
1bd90 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a   ){.    i64 nSiz
1bda0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1bdb0 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
1bdc0 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
1bdd0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
1bde0 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
1bdf0 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64   /* Used to hold
1be00 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f   return values o
1be10 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20  f fstat() */.   
1be20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
1be30 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
1be40 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1be50 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20  _IOERR_FSTAT;.. 
1be60 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79     nSize = ((nBy
1be70 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  te+pFile->szChun
1be80 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a  k-1) / pFile->sz
1be90 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
1bea0 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28  szChunk;.    if(
1beb0 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e   nSize>(i64)buf.
1bec0 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20  st_size ){..#if 
1bed0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53  defined(HAVE_POS
1bee0 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26  IX_FALLOCATE) &&
1bef0 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c   HAVE_POSIX_FALL
1bf00 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54  OCATE.      /* T
1bf10 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73  he code below is
1bf20 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65   handling the re
1bf30 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73  turn value of os
1bf40 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20  Fallocate() .   
1bf50 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e     ** correctly.
1bf60 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1bf70 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
1bf80 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f   "returns zero o
1bf90 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20  n success, .    
1bfa0 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72    ** or an error
1bfb0 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c   number on  fail
1bfc0 75 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61  ure". See the ma
1bfd0 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c  npage for detail
1bfe0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  s. */.      int 
1bff0 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  err;.      do{. 
1c000 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46         err = osF
1c010 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e  allocate(pFile->
1c020 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20  h, buf.st_size, 
1c030 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a  nSize-buf.st_siz
1c040 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  e);.      }while
1c050 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a  ( err==EINTR );.
1c060 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 20        if( err ) 
1c070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1c080 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65  ERR_WRITE;.#else
1c090 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1c0a0 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   OS does not hav
1c0b0 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  e posix_fallocat
1c0c0 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69  e(), fake it. Fi
1c0d0 72 73 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a  rst use.      **
1c0e0 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
1c0f0 73 65 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a  set the file siz
1c100 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
1c110 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20  single byte to. 
1c120 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74       ** the last
1c130 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c   byte in each bl
1c140 6f 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65  ock within the e
1c150 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20  xtended region. 
1c160 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73  This.      ** is
1c170 20 74 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69   the same techni
1c180 71 75 65 20 75 73 65 64 20 62 79 20 67 6c 69 62  que used by glib
1c190 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70  c to implement p
1c1a0 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1c1b0 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73  .      ** on sys
1c1c0 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  tems that do not
1c1d0 20 68 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c   have a real fal
1c1e0 6c 6f 63 61 74 65 28 29 20 73 79 73 74 65 6d 20  locate() system 
1c1f0 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  call..      */. 
1c200 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20       int nBlk = 
1c210 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20  buf.st_blksize; 
1c220 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20   /* File-system 
1c230 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20  block size */.  
1c240 20 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20      i64 iWrite; 
1c250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c260 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74  /* Next offset t
1c270 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20  o write to */.. 
1c280 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f       if( robust_
1c290 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
1c2a0 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20  >h, nSize) ){.  
1c2b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1c2c0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1c2d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75          return u
1c2e0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1c2f0 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1c300 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  E, "ftruncate", 
1c310 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1c320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 57 72       }.      iWr
1c330 69 74 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73  ite = ((buf.st_s
1c340 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31  ize + 2*nBlk - 1
1c350 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a  )/nBlk)*nBlk-1;.
1c360 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 57 72        while( iWr
1c370 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20  ite<nSize ){.   
1c380 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20       int nWrite 
1c390 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70  = seekAndWrite(p
1c3a0 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22  File, iWrite, ""
1c3b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
1c3c0 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65  ( nWrite!=1 ) re
1c3d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1c3e0 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 20  R_WRITE;.       
1c3f0 20 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b   iWrite += nBlk;
1c400 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1c410 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1c420 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1c430 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  ../*.** Informat
1c440 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  ion and control 
1c450 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  of an open file 
1c460 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
1c470 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f  c int unixFileCo
1c480 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
1c490 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
1c4a0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75  void *pArg){.  u
1c4b0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1c4c0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1c4d0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1c4e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c4f0 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
1c500 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1c510 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46  pArg = pFile->eF
1c520 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72  ileLock;.      r
1c530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c540 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c550 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e  SQLITE_LAST_ERRN
1c560 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
1c570 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1c580 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
1c590 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c5a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1c5b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
1c5c0 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
1c5d0 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
1c5e0 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
1c5f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c600 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c610 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c620 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
1c630 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b   {.      int rc;
1c640 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1c650 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1c660 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74  .      rc = fcnt
1c670 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c  lSizeHint(pFile,
1c680 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a   *(i64 *)pArg);.
1c690 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1c6a0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1c6b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c6c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c6d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
1c6e0 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20  SIST_WAL: {.    
1c6f0 20 20 69 6e 74 20 62 50 65 72 73 69 73 74 20 3d    int bPersist =
1c700 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20   *(int*)pArg;.  
1c710 20 20 20 20 69 66 28 20 62 50 65 72 73 69 73 74      if( bPersist
1c720 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28  <0 ){.        *(
1c730 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 70 46 69  int*)pArg = (pFi
1c740 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
1c750 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
1c760 5f 57 41 4c 29 21 3d 30 3b 0a 20 20 20 20 20 20  _WAL)!=0;.      
1c770 7d 65 6c 73 65 20 69 66 28 20 62 50 65 72 73 69  }else if( bPersi
1c780 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
1c790 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1c7a0 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 50  s &= ~UNIXFILE_P
1c7b0 45 52 53 49 53 54 5f 57 41 4c 3b 0a 20 20 20 20  ERSIST_WAL;.    
1c7c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c7d0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1c7e0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 45  s |= UNIXFILE_PE
1c7f0 52 53 49 53 54 5f 57 41 4c 3b 0a 20 20 20 20 20  RSIST_WAL;.     
1c800 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1c810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c820 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1c830 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1c840 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68   calls this meth
1c850 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61  od to signal tha
1c860 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20  t it has done.  
1c870 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
1c880 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
1c890 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f  abase is therefo
1c8a0 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  re unchanged and
1c8b0 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65  .    ** it hence
1c8c0 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68   it is OK for th
1c8d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68  e transaction ch
1c8e0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20  ange counter to 
1c8f0 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e  be.    ** unchan
1c900 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ged..    */.    
1c910 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1c920 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20  L_DB_UNCHANGED: 
1c930 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
1c940 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74  le*)id)->dbUpdat
1c950 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
1c960 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c970 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
1c980 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1c990 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1c9a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1c9b0 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
1c9c0 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
1c9d0 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ILE:.    case SQ
1c9e0 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
1c9f0 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
1ca00 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65  return proxyFile
1ca10 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41  Control(id,op,pA
1ca20 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rg);.    }.#endi
1ca30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
1ca40 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1ca50 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1ca60 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 20 20 63 61  PLE__) */.    ca
1ca70 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ca80 53 59 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a  SYNC_OMITTED: {.
1ca90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1caa0 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e 6f  ITE_OK;  /* A no
1cab0 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  -op */.    }.  }
1cac0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1cad0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
1cae0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1caf0 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
1cb00 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
1cb10 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
1cb20 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
1cb30 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
1cb40 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
1cb50 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
1cb60 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
1cb70 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
1cb80 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
1cb90 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
1cba0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1cbb0 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
1cbc0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
1cbd0 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
1cbe0 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
1cbf0 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
1cc00 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
1cc10 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
1cc20 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
1cc30 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
1cc40 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1cc50 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
1cc60 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
1cc70 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
1cc80 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1cc90 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
1cca0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1ccb0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
1ccc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
1ccd0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1cce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1ccf0 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
1cd00 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
1cd10 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
1cd20 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20  is always 0 for 
1cd30 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unix..*/.static 
1cd40 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
1cd50 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
1cd60 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
1cd70 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
1cd80 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1cd90 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
1cda0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1cdb0 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a  _OMIT_WAL.../*.*
1cdc0 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
1cdd0 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
1cde0 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
1cdf0 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
1ce00 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
1ce10 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
1ce20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
1ce30 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
1ce40 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
1ce50 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
1ce60 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
1ce70 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
1ce80 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
1ce90 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
1cea0 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
1ceb0 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
1cec0 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
1ced0 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
1cee0 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1cef0 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
1cf00 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
1cf10 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
1cf20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1cf30 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
1cf40 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
1cf50 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
1cf60 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
1cf70 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
1cf80 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
1cf90 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1cfa0 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
1cfb0 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
1cfc0 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
1cfd0 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
1cfe0 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
1cff0 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
1d000 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
1d010 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
1d020 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
1d030 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1d040 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
1d050 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
1d060 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1d070 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1d080 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
1d090 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
1d0a0 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
1d0b0 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
1d0c0 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
1d0d0 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
1d0e0 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
1d0f0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
1d100 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1d110 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
1d120 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
1d130 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1d140 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
1d150 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
1d160 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
1d170 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
1d180 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
1d190 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
1d1a0 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
1d1b0 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
1d1c0 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
1d1d0 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
1d1e0 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
1d1f0 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
1d200 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
1d210 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
1d220 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1d230 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
1d240 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
1d250 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
1d260 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
1d270 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
1d280 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
1d290 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
1d2a0 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
1d2b0 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
1d2c0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
1d2d0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
1d2e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1d2f0 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
1d300 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
1d310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d320 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
1d330 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
1d340 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d360 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
1d370 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
1d380 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20  .  u16 nRegion; 
1d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d3a0 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
1d3b0 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  pRegion */.  u8 
1d3c0 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20  isReadonly;     
1d3d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d3e0 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  if read-only */.
1d3f0 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f    char **apRegio
1d400 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
1d410 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20  Array of mapped 
1d420 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1d430 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
1d440 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1d450 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d460 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  of unixShm objec
1d470 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
1d480 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  his */.  unixShm
1d490 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1d4a0 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53      /* All unixS
1d4b0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
1d4c0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23  ing to this */.#
1d4d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1d4e0 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b  UG.  u8 exclMask
1d4f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d500 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
1d510 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
1d520 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
1d530 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1d540 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
1d550 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
1d560 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d580 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75  Next available u
1d590 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  nixShm.id value 
1d5a0 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
1d5b0 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
1d5c0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
1d5d0 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
1d5e0 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
1d5f0 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
1d600 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
1d610 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
1d620 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1d630 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
1d640 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
1d650 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
1d660 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
1d670 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
1d680 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70  .**    unixShm.p
1d690 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53  File.**    unixS
1d6a0 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
1d6b0 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
1d6c0 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
1d6d0 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d  e unixShm.pFile-
1d6e0 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
1d6f0 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
1d700 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
1d710 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
1d720 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20  .struct unixShm 
1d730 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
1d740 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f  *pShmNode;     /
1d750 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1d760 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1d770 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ect */.  unixShm
1d780 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
1d790 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78      /* Next unix
1d7a0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
1d7b0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
1d7c0 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d7e0 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
1d7f0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1d800 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69   mutex */.  u8 i
1d810 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1d820 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
1d830 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1d840 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53  within its unixS
1d850 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  hmNode */.  u16 
1d860 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
1d870 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1d880 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
1d890 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
1d8a0 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
1d8b0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
1d8c0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
1d8d0 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  eld */.};../*.**
1d8e0 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
1d8f0 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
1d900 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
1d910 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
1d920 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
1d930 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73           /* firs
1d940 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
1d950 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
1d960 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d  DMS    (UNIX_SHM
1d970 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
1d980 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
1d990 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
1d9a0 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78  *.** Apply posix
1d9b0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
1d9c0 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72  for all bytes fr
1d9d0 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20  om ofst through 
1d9e0 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20  ofst+n-1..**.** 
1d9f0 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74  Locks block if t
1da00 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74  he mask is exact
1da10 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e  ly UNIX_SHM_C an
1da20 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69  d are non-blocki
1da30 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ng.** otherwise.
1da40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1da50 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
1da60 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  (.  unixShmNode 
1da70 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70  *pShmNode, /* Ap
1da80 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
1da90 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
1daa0 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
1dab0 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
1dac0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e           /* F_UN
1dad0 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72  LCK, F_RDLCK, or
1dae0 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e   F_WRLCK */.  in
1daf0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
1db00 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
1db10 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  te of the lockin
1db20 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74  g range */.  int
1db30 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   n              
1db40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1db50 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
1db60 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
1db70 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20  ock f;       /* 
1db80 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  The posix adviso
1db90 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ry locking struc
1dba0 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ture */.  int rc
1dbb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1dbc0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
1dbd0 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a  orm fcntl() */..
1dbe0 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
1dbf0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
1dc00 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
1dc10 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
1dc20 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
1dc30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1dc40 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  d(pShmNode->mute
1dc50 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  x) || pShmNode->
1dc60 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
1dc70 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65   Shared locks ne
1dc80 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68  ver span more th
1dc90 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20  an one byte */. 
1dca0 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
1dcb0 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c   lockType!=F_RDL
1dcc0 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
1dcd0 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  s are within ran
1dce0 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
1dcf0 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45  n>=1 && n<SQLITE
1dd00 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  _SHM_NLOCK );.. 
1dd10 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
1dd20 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  >=0 ){.    /* In
1dd30 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
1dd40 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
1dd50 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66  */.    memset(&f
1dd60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b  , 0, sizeof(f));
1dd70 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20  .    f.l_type = 
1dd80 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e  lockType;.    f.
1dd90 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
1dda0 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61  SET;.    f.l_sta
1ddb0 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66  rt = ofst;.    f
1ddc0 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20  .l_len = n;..   
1ddd0 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53   rc = osFcntl(pS
1dde0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54  hmNode->h, F_SET
1ddf0 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20  LK, &f);.    rc 
1de00 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53  = (rc!=(-1)) ? S
1de10 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
1de20 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BUSY;.  }..  /
1de30 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f  * Update the glo
1de40 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61  bal lock state a
1de50 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63  nd do debug trac
1de60 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
1de70 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75  LITE_DEBUG.  { u
1de80 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41  16 mask;.  OSTRA
1de90 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29  CE(("SHM-LOCK ")
1dea0 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  );.  mask = (1<<
1deb0 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
1dec0 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  ofst);.  if( rc=
1ded0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dee0 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
1def0 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
1df00 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
1df10 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
1df20 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1df30 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
1df40 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
1df50 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
1df60 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65  &= ~mask;.    }e
1df70 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
1df80 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
1df90 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
1dfa0 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  d-lock %d ok", o
1dfb0 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
1dfc0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
1dfd0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
1dfe0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
1dff0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1e000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1e010 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
1e020 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
1e030 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
1e040 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  e-lock %d ok", o
1e050 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
1e060 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
1e070 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
1e080 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
1e090 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1e0a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1e0b0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
1e0c0 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
1e0d0 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
1e0e0 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
1e0f0 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t));.    }else i
1e100 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
1e110 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
1e120 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
1e130 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  k failed"));.   
1e140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1e150 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
1e160 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
1e170 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
1e180 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  -lock %d failed"
1e190 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a  , ofst));.    }.
1e1a0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
1e1b0 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 30   - afterwards %0
1e1c0 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
1e1d0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1e1e0 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68  >sharedMask, pSh
1e1f0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29  mNode->exclMask)
1e200 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1e210 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20   return rc;     
1e220 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75     .}.../*.** Pu
1e230 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  rge the unixShmN
1e240 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
1e250 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
1e260 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
1e270 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
1e280 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
1e290 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
1e2a0 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
1e2b0 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
1e2c0 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
1e2d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
1e2e0 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
1e2f0 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65  oid unixShmPurge
1e300 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
1e310 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
1e320 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d  p = pFd->pInode-
1e330 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
1e340 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
1e350 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ld() );.  if( p 
1e360 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  && p->nRef==0 ){
1e370 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1e380 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64  assert( p->pInod
1e390 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29  e==pFd->pInode )
1e3a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
1e3b0 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65  tex_free(p->mute
1e3c0 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  x);.    for(i=0;
1e3d0 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
1e3e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1e3f0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
1e400 20 20 6d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65    munmap(p->apRe
1e410 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65  gion[i], p->szRe
1e420 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gion);.      }el
1e430 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1e440 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
1e450 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20  gion[i]);.      
1e460 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1e470 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
1e480 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  gion);.    if( p
1e490 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
1e4a0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64  robust_close(pFd
1e4b0 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  , p->h, __LINE__
1e4c0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20  );.      p->h = 
1e4d0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  -1;.    }.    p-
1e4e0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1e4f0 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
1e500 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
1e510 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
1e520 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
1e530 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
1e540 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  th open database
1e550 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a   file pDbFd.  .*
1e560 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
1e570 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
1e580 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69   uses mmapped fi
1e590 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  les..**.** The f
1e5a0 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ile used to impl
1e5b0 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d  ement shared-mem
1e5c0 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 61  ory is in the sa
1e5d0 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  me directory.** 
1e5e0 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
1e5f0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61  base file and ha
1e600 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
1e610 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
1e620 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74  base.** file wit
1e630 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66  h the "-shm" suf
1e640 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20  fix added.  For 
1e650 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1e660 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1e670 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31   is "/home/user1
1e680 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e  /config.db" then
1e690 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 69   the file that i
1e6a0 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d  s created and mm
1e6b0 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61  apped.** for sha
1e6c0 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
1e6d0 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65  be called "/home
1e6e0 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
1e6f0 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  -shm".  .**.** A
1e700 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68 20  nother approach 
1e710 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c  to is to use fil
1e720 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f  es in /dev/shm o
1e730 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e  r /dev/tmp or an
1e740 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74  .** some other t
1e750 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20  mpfs mount. But 
1e760 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64  if a file in a d
1e770 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f  ifferent directo
1e780 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  ry.** from the d
1e790 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1e7a0 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65  used, then diffe
1e7b0 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d  ring access perm
1e7c0 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20  issions.** or a 
1e7d0 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63  chroot() might c
1e7e0 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72 65  ause two differe
1e7f0 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20  nt processes on 
1e800 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61  the same.** data
1e810 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75  base to end up u
1e820 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66  sing different f
1e830 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64 20  iles for shared 
1e840 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61  memory - .** mea
1e850 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72 20  ning that their 
1e860 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74  memory would not
1e870 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65   really be share
1e880 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  d - resulting.**
1e890 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72   in database cor
1e8a0 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74  ruption.  Nevert
1e8b0 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70  heless, this tmp
1e8c0 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a  fs file usage.**
1e8d0 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20   can be enabled 
1e8e0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
1e8f0 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53  using -DSQLITE_S
1e900 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64  HM_DIRECTORY="/d
1e910 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68  ev/shm".** or th
1e920 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54  e equivalent.  T
1e930 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51  he use of the SQ
1e940 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
1e950 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  RY compile-time.
1e960 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74  ** option result
1e970 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  s in an incompat
1e980 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51  ible build of SQ
1e990 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66  Lite;  builds of
1e9a0 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20   SQLite.** that 
1e9b0 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 53  with differing S
1e9c0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1e9d0 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 74  ORY settings att
1e9e0 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a  empt to use the.
1e9f0 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  ** same database
1ea00 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
1ea10 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65  e time, database
1ea20 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
1ea30 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
1ea40 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48  t. The SQLITE_SH
1ea50 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
1ea60 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
1ea70 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a  is considered.**
1ea80 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61   "unsupported" a
1ea90 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69  nd may go away i
1eaa0 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69 74  n a future SQLit
1eab0 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a  e release..**.**
1eac0 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
1ead0 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
1eae0 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
1eaf0 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
1eb00 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
1eb10 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
1eb20 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
1eb30 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
1eb40 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
1eb50 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
1eb60 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
1eb70 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
1eb80 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
1eb90 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eared..**.** If 
1eba0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1ebb0 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62 46  abase file (pDbF
1ebc0 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65 20  d) is using the 
1ebd0 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a  "unix-excl" VFS.
1ebe0 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  ** that means th
1ebf0 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  at an exclusive 
1ec00 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
1ec10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ec20 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f  e and.** that no
1ec30 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1ec40 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61   are able to rea
1ec50 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 64  d or write the d
1ec60 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20  atabase.  In.** 
1ec70 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f  that case, we do
1ec80 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64   not really need
1ec90 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
1eca0 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   No shared memor
1ecb0 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65  y.** file is cre
1ecc0 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72 65  ated.  The share
1ecd0 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
1ece0 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20   simulated with 
1ecf0 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  heap memory..*/.
1ed00 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
1ed10 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
1ed20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29  unixFile *pDbFd)
1ed30 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  {.  struct unixS
1ed40 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  hm *p = 0;      
1ed50 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
1ed60 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
1ed70 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ed */.  struct u
1ed80 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1ed90 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75  Node;   /* The u
1eda0 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
1edb0 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
1edc0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ede0 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
1edf0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
1ee00 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
1ee10 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20  /* The inode of 
1ee20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  fd */.  char *zS
1ee30 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
1ee40 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1ee50 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65 64  of the file used
1ee60 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e   for SHM */.  in
1ee70 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20  t nShmFilename; 
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ee90 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d   Size of the SHM
1eea0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74   filename in byt
1eeb0 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  es */..  /* Allo
1eec0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
1eed0 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f  he new unixShm o
1eee0 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20  bject. */.  p = 
1eef0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1ef00 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
1ef10 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1ef20 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1ef30 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
1ef40 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73  izeof(*p));.  as
1ef50 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68  sert( pDbFd->pSh
1ef60 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  m==0 );..  /* Ch
1ef70 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
1ef80 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1ef90 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ct already exist
1efa0 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69 73  s. Reuse an exis
1efb0 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66  ting.  ** one if
1efc0 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65   present. Create
1efd0 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
1efe0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
1eff0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1f000 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62  ;.  pInode = pDb
1f010 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53  Fd->pInode;.  pS
1f020 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  hmNode = pInode-
1f030 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28  >pShmNode;.  if(
1f040 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a   pShmNode==0 ){.
1f050 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
1f060 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
1f070 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28         /* fstat(
1f080 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62  ) info for datab
1f090 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
1f0a0 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29   /* Call fstat()
1f0b0 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74   to figure out t
1f0c0 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  he permissions o
1f0d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1f0e0 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ile. If.    ** a
1f0f0 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20   new *-shm file 
1f100 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61  is created, an a
1f110 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d  ttempt will be m
1f120 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69 74  ade to create it
1f130 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
1f140 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
1f150 73 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70 65  s. The actual pe
1f160 72 6d 69 73 73 69 6f 6e 73 20 74 68 65 20 66 69  rmissions the fi
1f170 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 20 20  le is created.  
1f180 20 20 2a 2a 20 77 69 74 68 20 61 72 65 20 73 75    ** with are su
1f190 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63 75 72  bject to the cur
1f1a0 72 65 6e 74 20 75 6d 61 73 6b 20 73 65 74 74 69  rent umask setti
1f1b0 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ng..    */.    i
1f1c0 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46 64  f( osFstat(pDbFd
1f1d0 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26 20  ->h, &sStat) && 
1f1e0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
1f1f0 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
1f200 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1f210 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20  RR_FSTAT;.      
1f220 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1f230 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  r;.    }..#ifdef
1f240 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
1f250 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69  CTORY.    nShmFi
1f260 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28  lename = sizeof(
1f270 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1f280 54 4f 52 59 29 20 2b 20 33 30 3b 0a 23 65 6c 73  TORY) + 30;.#els
1f290 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  e.    nShmFilena
1f2a0 6d 65 20 3d 20 35 20 2b 20 28 69 6e 74 29 73 74  me = 5 + (int)st
1f2b0 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74  rlen(pDbFd->zPat
1f2c0 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  h);.#endif.    p
1f2d0 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65  ShmNode = sqlite
1f2e0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
1f2f0 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53  (*pShmNode) + nS
1f300 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20  hmFilename );.  
1f310 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
1f320 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1f330 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1f340 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1f350 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  n_err;.    }.   
1f360 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65   memset(pShmNode
1f370 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68  , 0, sizeof(*pSh
1f380 6d 4e 6f 64 65 29 29 3b 0a 20 20 20 20 7a 53 68  mNode));.    zSh
1f390 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d  mFilename = pShm
1f3a0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  Node->zFilename 
1f3b0 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f  = (char*)&pShmNo
1f3c0 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51  de[1];.#ifdef SQ
1f3d0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
1f3e0 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  RY.    sqlite3_s
1f3f0 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
1f400 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
1f410 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
1f420 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1f430 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22  _SHM_DIRECTORY "
1f440 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25  /sqlite-shm-%x-%
1f450 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
1f460 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53           (u32)sS
1f470 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32  tat.st_ino, (u32
1f480 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a  )sStat.st_dev);.
1f490 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65  #else.    sqlite
1f4a0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
1f4b0 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c  ilename, zShmFil
1f4c0 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
1f4d0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1f4e0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
1f4f0 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
1f500 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ath, zShmFilenam
1f510 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  e);.#endif.    p
1f520 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b  ShmNode->h = -1;
1f530 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f  .    pDbFd->pIno
1f540 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de->pShmNode = p
1f550 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68  ShmNode;.    pSh
1f560 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20  mNode->pInode = 
1f570 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
1f580 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
1f590 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
1f5a0 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
1f5b0 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
1f5c0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
1f5d0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
1f5e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1f5f0 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
1f600 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1f610 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   }..    if( pIno
1f620 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
1f630 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 68  ==0 ){.      pSh
1f640 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
1f650 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e  t_open(zShmFilen
1f660 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  ame, O_RDWR|O_CR
1f670 45 41 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAT,.           
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 20 20 20 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f      (sStat.st_mo
1f6a0 64 65 20 26 20 30 37 37 37 29 29 3b 0a 20 20 20  de & 0777));.   
1f6b0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
1f6c0 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >h<0 ){.        
1f6d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 4f 3b  const char *zRO;
1f6e0 0a 20 20 20 20 20 20 20 20 7a 52 4f 20 3d 20 73  .        zRO = s
1f6f0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1f700 65 74 65 72 28 70 44 62 46 64 2d 3e 7a 50 61 74  eter(pDbFd->zPat
1f710 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  h, "readonly_shm
1f720 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
1f730 7a 52 4f 20 26 26 20 73 71 6c 69 74 65 33 47 65  zRO && sqlite3Ge
1f740 74 42 6f 6f 6c 65 61 6e 28 7a 52 4f 29 20 29 7b  tBoolean(zRO) ){
1f750 0a 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e  .          pShmN
1f760 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f  ode->h = robust_
1f770 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d  open(zShmFilenam
1f780 65 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 0a 20 20 20  e, O_RDONLY,.   
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7b0 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20   (sStat.st_mode 
1f7c0 26 20 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20  & 0777));.      
1f7d0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
1f7e0 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
1f7f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f800 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  if( pShmNode->h<
1f810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
1f820 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
1f830 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
1f840 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
1f850 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
1f860 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1f870 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
1f880 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a     }.      }.  .
1f890 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
1f8a0 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
1f8b0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
1f8c0 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
1f8d0 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a   switch..      *
1f8e0 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
1f8f0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
1f900 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
1f910 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
1f920 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f930 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73    if( unixShmSys
1f940 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1f950 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f  , F_WRLCK, UNIX_
1f960 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
1f970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f980 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1f990 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
1f9a0 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  >h, 0) ){.      
1f9b0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
1f9c0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1f9d0 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72  RR_SHMOPEN, "ftr
1f9e0 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c  uncate", zShmFil
1f9f0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
1fa00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1fa10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fa20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1fa30 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
1fa40 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
1fa50 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  RDLCK, UNIX_SHM_
1fa60 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  DMS, 1);.      }
1fa70 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1fa80 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1fa90 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
1faa0 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
1fab0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
1fac0 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68  ld of the unixSh
1fad0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
1fae0 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
1faf0 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
1fb00 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
1fb10 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
1fb20 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
1fb30 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
1fb40 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
1fb50 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76   = p;.  unixLeav
1fb60 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  eMutex();..  /* 
1fb70 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
1fb80 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20  unt on pShmNode 
1fb90 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1fba0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64   incremented und
1fbb0 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65  er.  ** the cove
1fbc0 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74  r of the unixEnt
1fbd0 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20  erMutex() mutex 
1fbe0 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  and the pointer 
1fbf0 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65  from the.  ** ne
1fc00 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68  w (struct unixSh
1fc10 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  m) object to the
1fc20 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65   pShmNode has be
1fc30 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74  en set. All that
1fc40 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f   is.  ** left to
1fc50 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74   do is to link t
1fc60 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e  he new object in
1fc70 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
1fc80 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  st starting.  **
1fc90 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46   at pShmNode->pF
1fca0 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20  irst. This must 
1fcb0 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f  be done while ho
1fcc0 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f  lding the pShmNo
1fcd0 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20  de->mutex .  ** 
1fce0 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  mutex..  */.  sq
1fcf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1fd00 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1fd10 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  x);.  p->pNext =
1fd20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1fd30 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  t;.  pShmNode->p
1fd40 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c  First = p;.  sql
1fd50 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1fd60 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1fd70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1fd80 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
1fd90 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
1fda0 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
1fdb0 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75  err:.  unixShmPu
1fdc0 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20  rge(pDbFd);     
1fdd0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
1fde0 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
1fdf0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
1fe00 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1fe10 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1fe20 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
1fe30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1fe40 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1fe50 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
1fe60 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
1fe70 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
1fe80 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
1fe90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1fea0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1feb0 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
1fec0 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
1fed0 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
1fee0 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
1fef0 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
1ff00 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
1ff10 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
1ff20 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
1ff30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1ff40 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
1ff50 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
1ff60 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
1ff70 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
1ff80 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62  erwise, if the b
1ff90 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72  Extend parameter
1ffa0 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
1ffb0 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
1ffc0 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
1ffd0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1ffe0 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
1fff0 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
20000 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
20010 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
20020 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
20030 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
20040 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
20050 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62  turned. If .** b
20060 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65  Extend is non-ze
20070 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
20080 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
20090 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
200a0 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
200b0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
200c0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
200d0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
200e0 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
200f0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
20100 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
20110 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
20120 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
20130 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
20140 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
20150 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
20160 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
20170 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
20180 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
20190 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
201a0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
201b0 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
201c0 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
201d0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
201e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
201f0 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71  unixShmMap(.  sq
20200 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20220 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
20230 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
20240 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
20250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20260 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
20270 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
20280 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
20290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
202a0 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
202b0 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e   */.  int bExten
202c0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
202d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
202e0 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
202f0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
20300 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
20310 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
20320 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
20330 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  mory */.){.  uni
20340 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
20350 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
20360 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e  unixShm *p;.  un
20370 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
20380 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
20390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
203a0 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
203b0 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e  emory file has n
203c0 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
203d0 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
203e0 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d   */.  if( pDbFd-
203f0 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >pShm==0 ){.    
20400 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61  rc = unixOpenSha
20410 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29  redMemory(pDbFd)
20420 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
20430 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
20440 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20   rc;.  }..  p = 
20450 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70  pDbFd->pShm;.  p
20460 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
20470 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33  mNode;.  sqlite3
20480 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
20490 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
204a0 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f   assert( szRegio
204b0 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52  n==pShmNode->szR
204c0 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64  egion || pShmNod
204d0 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b  e->nRegion==0 );
204e0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
204f0 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
20500 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
20510 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
20520 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d  ->h>=0 || pDbFd-
20530 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
20540 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73  sLock==1 );.  as
20550 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
20560 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  h<0 || pDbFd->pI
20570 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
20580 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ck==0 );..  if( 
20590 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
205a0 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  n<=iRegion ){.  
205b0 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20    char **apNew; 
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65       /* New apRe
205e0 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
205f0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
20600 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65  (iRegion+1)*szRe
20610 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  gion;  /* Minimu
20620 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
20630 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  size */.    stru
20640 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
20650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20660 2a 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28  * Used by fstat(
20670 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ) */..    pShmNo
20680 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73  de->szRegion = s
20690 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66  zRegion;..    if
206a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
206b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
206c0 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
206d0 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
206e0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
206f0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
20700 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63  e..      ** Chec
20710 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68  k to see if it h
20720 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
20730 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77  d (i.e. if the w
20740 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73  al-index file is
20750 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20  .      ** large 
20760 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69  enough to contai
20770 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
20780 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a  region)..      *
20790 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  /.      if( osFs
207a0 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  tat(pShmNode->h,
207b0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
207c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
207d0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20  IOERR_SHMSIZE;. 
207e0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
207f0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
20800 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53  .  .      if( sS
20810 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74  tat.st_size<nByt
20820 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
20830 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
20840 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
20850 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62   not exist. If b
20860 45 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f  Extend is set to
20870 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73  .        ** fals
20880 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a  e, exit early. *
20890 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  pp will be set t
208a0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
208b0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20  E_OK returned.. 
208c0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
208d0 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    ** Alternative
208e0 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69  ly, if bExtend i
208f0 73 20 74 72 75 65 2c 20 75 73 65 20 66 74 72 75  s true, use ftru
20900 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63  ncate() to alloc
20910 61 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ate.        ** t
20920 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
20930 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20  ory region..    
20940 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
20950 66 28 20 21 62 45 78 74 65 6e 64 20 29 20 67 6f  f( !bExtend ) go
20960 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
20970 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
20980 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
20990 6d 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29  mNode->h, nByte)
209a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
209b0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
209c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
209d0 53 49 5a 45 2c 20 22 66 74 72 75 6e 63 61 74 65  SIZE, "ftruncate
209e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
209f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
20a00 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
20a10 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
20a20 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
20a30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20a40 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
20a50 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
20a60 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
20a70 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
20a80 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
20a90 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
20aa0 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69   = (char **)sqli
20ab0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
20ac0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
20ad0 70 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f  pRegion, (iRegio
20ae0 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72  n+1)*sizeof(char
20af0 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   *).    );.    i
20b00 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20  f( !apNew ){.   
20b10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
20b20 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
20b30 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
20b40 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
20b50 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
20b60 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68   = apNew;.    wh
20b70 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ile(pShmNode->nR
20b80 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b  egion<=iRegion){
20b90 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65  .      void *pMe
20ba0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  m;.      if( pSh
20bb0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
20bc0 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6d 6d         pMem = mm
20bd0 61 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a  ap(0, szRegion,.
20be0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
20bf0 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
20c00 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50   ? PROT_READ : P
20c10 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52  ROT_READ|PROT_WR
20c20 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ITE, .          
20c30 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53    MAP_SHARED, pS
20c40 68 6d 4e 6f 64 65 2d 3e 68 2c 20 70 53 68 6d 4e  hmNode->h, pShmN
20c50 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52  ode->nRegion*szR
20c60 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b  egion.        );
20c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
20c80 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  m==MAP_FAILED ){
20c90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
20ca0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
20cb0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
20cc0 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f  , "mmap", pShmNo
20cd0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
20ce0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
20cf0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
20d00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
20d10 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  e{.        pMem 
20d20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
20d30 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
20d40 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20      if( pMem==0 
20d50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
20d60 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
20d70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
20d80 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
20d90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
20da0 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a  mset(pMem, 0, sz
20db0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
20dc0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
20dd0 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  >apRegion[pShmNo
20de0 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70  de->nRegion] = p
20df0 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Mem;.      pShmN
20e00 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a  ode->nRegion++;.
20e10 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61      }.  }..shmpa
20e20 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53  ge_out:.  if( pS
20e30 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e  hmNode->nRegion>
20e40 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a  iRegion ){.    *
20e50 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  pp = pShmNode->a
20e60 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  pRegion[iRegion]
20e70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
20e80 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  pp = 0;.  }.  if
20e90 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65  ( pShmNode->isRe
20ea0 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51  adonly && rc==SQ
20eb0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53  LITE_OK ) rc = S
20ec0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
20ed0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20ee0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
20ef0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
20f00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
20f10 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
20f20 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
20f30 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
20f40 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
20f50 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69   the relationshi
20f60 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64  p between SHAREd
20f70 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c   and EXCLUSIVE l
20f80 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ocks is a little
20f90 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65  .** different he
20fa0 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78  re than in posix
20fb0 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29  .  In xShmLock()
20fc0 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f  , one can go fro
20fd0 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f  m unlocked.** to
20fe0 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b   shared and back
20ff0 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   or from unlocke
21000 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61  d to exclusive a
21010 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e  nd back.  But on
21020 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20  e may.** not go 
21030 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65  from shared to e
21040 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d  xclusive or from
21050 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68   exclusive to sh
21060 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
21070 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28  int unixShmLock(
21080 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
21090 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
210a0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
210b0 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
210c0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
210d0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
210e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
210f0 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
21100 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
21110 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
21120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21130 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
21140 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
21150 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
21160 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
21170 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
21180 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
21190 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  k */.){.  unixFi
211a0 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
211b0 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  xFile*)fd;      
211c0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
211d0 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
211e0 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ory */.  unixShm
211f0 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
21200 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
21210 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
21220 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
21230 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
21240 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
21250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21260 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
21270 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
21280 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
21290 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
212a0 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75  mNode;  /* The u
212b0 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69  nderlying file i
212c0 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Node */.  int rc
212d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212f0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
21300 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
21330 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
21340 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
21350 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
21360 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
21370 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
21380 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
21390 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
213a0 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
213b0 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20  assert( ofst>=0 
213c0 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54  && ofst+n<=SQLIT
213d0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20  E_SHM_NLOCK );. 
213e0 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b   assert( n>=1 );
213f0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
21400 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
21410 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
21420 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
21430 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
21440 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
21450 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
21460 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
21470 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
21480 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
21490 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
214a0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
214b0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
214c0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
214d0 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65  USIVE) );.  asse
214e0 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61  rt( n==1 || (fla
214f0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
21500 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b  EXCLUSIVE)!=0 );
21510 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
21520 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62  ode->h>=0 || pDb
21530 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
21540 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  cessLock==1 );. 
21550 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
21560 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d  e->h<0 || pDbFd-
21570 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
21580 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d  sLock==0 );..  m
21590 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b  ask = (1<<(ofst+
215a0 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b  n)) - (1<<ofst);
215b0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
215c0 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
215d0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
215e0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
215f0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
21600 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
21610 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
21620 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
21630 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
21640 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
21650 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
21660 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
21670 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
21680 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
21690 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
216a0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
216b0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
216c0 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
216d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
216e0 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
216f0 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
21700 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
21710 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
21720 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
21730 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
21740 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
21750 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
21760 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
21770 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
21780 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
21790 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
217a0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
217b0 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_UNLCK, ofst+UN
217c0 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
217d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
217e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
217f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
21800 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
21810 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
21820 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21830 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
21840 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
21850 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
21860 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
21870 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c   .  }else if( fl
21880 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
21890 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
218a0 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
218b0 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
218c0 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
218d0 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
218e0 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
218f0 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
21900 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
21910 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
21920 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
21930 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
21940 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
21950 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
21960 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
21970 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
21980 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
21990 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
219a0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
219b0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
219c0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
219d0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
219e0 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
219f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21a00 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
21a10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21a20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
21a30 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
21a40 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
21a50 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
21a60 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
21a70 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
21a80 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
21a90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21aa0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
21ab0 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
21ac0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
21ad0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
21ae0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
21af0 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_RDLCK, ofst+U
21b00 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
21b10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21b20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
21b30 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
21b40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
21b50 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65   the local share
21b60 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  d locks */.    i
21b70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21b80 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   ){.      p->sha
21b90 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
21ba0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
21bb0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
21bc0 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   no sibling conn
21bd0 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63  ections hold loc
21be0 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f  ks that will blo
21bf0 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c  ck this.    ** l
21c00 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c  ock.  If any do,
21c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
21c20 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a  USY right away..
21c30 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
21c40 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
21c50 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
21c60 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
21c70 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
21c80 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58   mask)!=0 || (pX
21c90 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
21ca0 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
21cb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
21cc0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
21cd0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
21ce0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20  }.  .    /* Get 
21cf0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
21d00 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
21d10 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69  m level.  Then i
21d20 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20  f successful.   
21d30 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68   ** also mark th
21d40 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
21d50 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b  on as being lock
21d60 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
21d70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21d80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
21d90 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
21da0 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c  (pShmNode, F_WRL
21db0 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
21dc0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
21dd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21de0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
21df0 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
21e00 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
21e10 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
21e20 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
21e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21e40 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
21e50 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
21e60 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
21e70 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
21e80 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64  shmid-%d, pid-%d
21e90 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e   got %03x,%03x\n
21ea0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
21eb0 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70  >id, getpid(), p
21ec0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d  ->sharedMask, p-
21ed0 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72  >exclMask));.  r
21ee0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21ef0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
21f00 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
21f10 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
21f20 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
21f30 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64   .**.** All load
21f40 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
21f50 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
21f60 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
21f70 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
21f80 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
21f90 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
21fa0 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
21fb0 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42  ic void unixShmB
21fc0 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65  arrier(.  sqlite
21fd0 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20  3_file *fd      
21fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
21ff0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
22000 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
22010 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
22020 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
22030 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
22040 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61  tex();.  unixLea
22050 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
22060 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
22070 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
22080 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
22090 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
220a0 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
220b0 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
220c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
220d0 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d  e is no shared m
220e0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
220f0 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63   with the connec
22100 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a  tion then this.*
22110 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  * routine is a h
22120 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
22130 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22140 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  xShmUnmap(.  sql
22150 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22170 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
22180 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
22190 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221b0 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72    /* Delete shar
221c0 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75  ed-memory if tru
221d0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  e */.){.  unixSh
221e0 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
221f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22200 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
22210 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
22220 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
22230 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
22240 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
22250 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
22260 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
22270 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20  **pp;           
22280 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
22290 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
222a0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
222b0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
222c0 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  DbFd;           
222d0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
222e0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
222f0 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64  file */..  pDbFd
22300 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
22310 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
22320 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
22330 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
22340 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
22350 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
22360 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
22370 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
22380 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
22390 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
223a0 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
223b0 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a  >pInode );..  /*
223c0 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
223d0 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
223e0 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
223f0 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
22400 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
22410 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
22420 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
22430 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
22440 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
22450 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
22460 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
22470 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
22480 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
22490 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
224a0 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
224b0 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
224c0 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
224d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
224e0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
224f0 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
22500 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
22510 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
22520 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
22530 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
22540 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
22550 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  oo */.  unixEnte
22560 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
22570 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
22580 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
22590 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
225a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
225b0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
225c0 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68  eleteFlag && pSh
225d0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f 73  mNode->h>=0 ) os
225e0 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  Unlink(pShmNode-
225f0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
22600 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
22610 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  bFd);.  }.  unix
22620 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
22630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22640 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64  K;.}...#else.# d
22650 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70  efine unixShmMap
22660 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
22670 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30  unixShmLock    0
22680 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
22690 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
226a0 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  ine unixShmUnmap
226b0 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
226c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
226d0 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
226e0 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
226f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
22700 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
22710 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
22720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22730 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
22740 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
22750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
22770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
227c0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
227d0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  on contains defi
227e0 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74  nitions of sqlit
227f0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
22800 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d  jects that.** im
22810 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20  plement various 
22820 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  file locking str
22830 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73  ategies.  It als
22840 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  o contains defin
22850 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69  itions.** of "fi
22860 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e  nder" functions.
22870 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74    A finder-funct
22880 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ion is used to l
22890 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70  ocate the approp
228a0 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33  riate.** sqlite3
228b0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
228c0 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ct for a particu
228d0 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  lar database fil
228e0 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61  e.  The pAppData
228f0 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
22900 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53   sqlite3_vfs VFS
22910 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69   objects are ini
22920 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70  tialized to be p
22930 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68  ointers to.** th
22940 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72  e correct finder
22950 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68  -function for th
22960 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  at VFS..**.** Mo
22970 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  st finder functi
22980 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ons return a poi
22990 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20  nter to a fixed 
229a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
229b0 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54  ds.** object.  T
229c0 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74  he only interest
229d0 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ing finder-funct
229e0 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49  ion is autolockI
229f0 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a  oFinder, which.*
22a00 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  * looks at the f
22a10 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61  ilesystem type a
22a20 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73  nd tries to gues
22a30 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  s the best locki
22a40 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66  ng.** strategy f
22a50 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20  rom that..**.** 
22a60 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69  For finder-funti
22a70 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74  on F, two object
22a80 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a  s are created:.*
22a90 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20  *.**    (1) The 
22aa0 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63  real finder-func
22ab0 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70  tion named "FImp
22ac0 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  t()"..**.**    (
22ad0 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f  2) A constant po
22ae0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75  inter to this fu
22af0 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73  nction named jus
22b00 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  t "F"..**.**.** 
22b10 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
22b20 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73   F pointer is us
22b30 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61  ed as the pAppDa
22b40 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53  ta value for VFS
22b50 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65  .** objects.  We
22b60 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73   have to do this
22b70 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74   instead of lett
22b80 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69  ing pAppData poi
22b90 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61  nt.** directly a
22ba0 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e  t the finder-fun
22bb0 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20  ction since C90 
22bc0 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20  rules prevent a 
22bd0 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65  void*.** from be
22be0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e   cast into a fun
22bf0 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a  ction pointer..*
22c00 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73  *.**.** Each ins
22c10 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61  tance of this ma
22c20 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77  cro generates tw
22c30 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a  o objects:.**.**
22c40 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74     *  A constant
22c50 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
22c60 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20  ods object call 
22c70 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20  METHOD that has 
22c80 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  locking.**      
22c90 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c  methods CLOSE, L
22ca0 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52  OCK, UNLOCK, CKR
22cb0 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20  ESLOCK..**.**   
22cc0 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64  *  An I/O method
22cd0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
22ce0 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74   called FINDER t
22cf0 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f  hat returns a po
22d00 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f  inter.**      to
22d10 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65   the METHOD obje
22d20 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ct in the previo
22d30 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64  us bullet..*/.#d
22d40 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28  efine IOMETHODS(
22d50 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20  FINDER, METHOD, 
22d60 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20  VERSION, CLOSE, 
22d70 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
22d80 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61  LOCK)      \.sta
22d90 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
22da0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54  3_io_methods MET
22db0 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20  HOD = {         
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 20 5c 0a 20 20 20 56            \.   V
22de0 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20  ERSION,         
22df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
22e00 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20  ersion */       
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 20 5c 0a 20 20 20 43 4c           \.   CL
22e30 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
22e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
22e50 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
22e80 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  xRead,          
22e90 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
22ea0 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  d */            
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
22ed0 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
22ee0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
22ef0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54        \.   unixT
22f20 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
22f30 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
22f40 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ate */          
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79       \.   unixSy
22f70 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
22f80 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
22f90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
22fc0 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
22fd0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
22fe0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23000 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20     \.   LOCK,   
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23020 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20      /* xLock */ 
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20    \.   UNLOCK,  
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23070 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230a0 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20   \.   CKLOCK,   
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230c0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
230d0 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  vedLock */      
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  \.   unixFileCon
23100 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
23110 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
23120 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23140 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69  .   unixSectorSi
23150 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
23160 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
23170 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23190 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61     unixDeviceCha
231a0 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f  racteristics,  /
231b0 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c  * xDeviceCapabil
231c0 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20  ities */        
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
231e0 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20    unixShmMap,   
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23200 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20   xShmMap */     
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23220 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
23230 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20   unixShmLock,   
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23250 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  xShmLock */     
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23280 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20  unixShmBarrier, 
23290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
232a0 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20  ShmBarrier */   
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
232d0 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 20 20  nixShmUnmap     
232e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
232f0 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20  hmUnmap */      
23300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23310 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20           \.};   
23320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23360 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
23370 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
23380 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45  o_methods *FINDE
23390 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68  R##Impl(const ch
233a0 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20  ar *z, unixFile 
233b0 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45  *p){   \.  UNUSE
233c0 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20  D_PARAMETER(z); 
233d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
233e0 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  (p);            
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23400 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e        \.  return
23410 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20   &METHOD;       
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23450 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20       \.}        
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234a0 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
234b0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
234c0 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46  thods *(*const F
234d0 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61  INDER)(const cha
234e0 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20  r*,unixFile *p) 
234f0 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45     \.    = FINDE
23500 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  R##Impl;../*.** 
23510 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20  Here are all of 
23520 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
23530 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66  ethods objects f
23540 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  or each of the.*
23550 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  * locking strate
23560 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73  gies.  Functions
23570 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69   that return poi
23580 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d  nters to these m
23590 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c  ethods.** are al
235a0 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49  so created..*/.I
235b0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69  OMETHODS(.  posi
235c0 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  xIoFinder,      
235d0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
235e0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
235f0 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  .  posixIoMethod
23600 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
23610 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
23620 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
23630 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20  /.  2,          
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23650 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
23660 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75  s enabled */.  u
23670 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
23680 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
23690 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
236a0 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
236b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
236c0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
236d0 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ixUnlock,       
236e0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
236f0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
23700 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
23710 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65  Lock     /* xChe
23720 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
23730 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54  ethod */.).IOMET
23740 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  HODS(.  nolockIo
23750 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
23760 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
23770 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
23780 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  olockIoMethods, 
23790 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
237a0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
237b0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
237c0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
237d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
237e0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
237f0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  sabled */.  nolo
23800 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
23810 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
23820 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
23830 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
23840 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
23850 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
23860 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
23870 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
23880 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
23890 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
238a0 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ock   /* xCheckR
238b0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
238c0 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
238d0 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  S(.  dotlockIoFi
238e0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  nder,          /
238f0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
23900 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  n name */.  dotl
23910 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
23920 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
23930 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
23940 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
23970 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
23980 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  led */.  dotlock
23990 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
239a0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
239b0 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
239c0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
239d0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
239e0 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55  od */.  dotlockU
239f0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
23a00 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
23a10 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
23a20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23a30 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  k  /* xCheckRese
23a40 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
23a50 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  */.)..#if SQLITE
23a60 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
23a70 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
23a80 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
23a90 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23ab0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
23ac0 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
23ad0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
23ae0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
23af0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
23b00 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
23b30 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
23b40 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
23b50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23b60 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
23b70 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
23b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b90 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
23ba0 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
23bb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
23bc0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
23bd0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
23be0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
23bf0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
23c00 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
23c10 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53  ).#endif..#if OS
23c20 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
23c30 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65  DS(.  semIoFinde
23c40 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
23c50 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
23c60 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d  on name */.  sem
23c70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
23c80 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
23c90 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
23ca0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cc0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
23cd0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
23ce0 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f  bled */.  semClo
23cf0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
23d00 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
23d10 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63  thod */.  semLoc
23d20 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23d30 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
23d40 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f  hod */.  semUnlo
23d50 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23d60 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
23d70 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65  thod */.  semChe
23d80 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
23d90 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
23da0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
23db0 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
23dc0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
23dd0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
23de0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
23df0 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
23e00 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20   afpIoFinder,   
23e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23e20 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
23e30 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74  me */.  afpIoMet
23e40 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
23e50 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
23e60 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
23e70 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e90 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
23ea0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
23eb0 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20  */.  afpClose,  
23ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ed0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
23ee0 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20  */.  afpLock,   
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23f00 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
23f10 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20  /.  afpUnlock,  
23f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23f30 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
23f40 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73  */.  afpCheckRes
23f50 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
23f60 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
23f70 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
23f80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
23f90 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
23fa0 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75   method is a "su
23fb0 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  per-method" in t
23fc0 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  he sense that it
23fd0 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64  .** opens second
23fe0 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ary file descrip
23ff0 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e  tors for the con
24000 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ch and lock file
24010 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73  s and.** it uses
24020 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65   proxy, dot-file
24030 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b  , AFP, and flock
24040 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  () locking metho
24050 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73  ds on those.** s
24060 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20  econdary files. 
24070 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
24080 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
24090 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  hat implements.*
240a0 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * proxy locking 
240b0 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20  is located much 
240c0 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20  further down in 
240d0 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77  the file.  But w
240e0 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20  e need.** to go 
240f0 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65  ahead and define
24100 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
24110 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64  methods and find
24120 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  er function.** f
24130 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
24140 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f   here.  So we fo
24150 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68  rward declare th
24160 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a  e I/O methods..*
24170 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
24180 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
24190 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
241a0 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69  G_STYLE.static i
241b0 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
241c0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
241d0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
241e0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
241f0 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
24200 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
24210 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
24220 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
24230 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
24240 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
24250 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45  le*, int*);.IOME
24260 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f  THODS(.  proxyIo
24270 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
24280 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
24290 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
242a0 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20  proxyIoMethods, 
242b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
242c0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
242d0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
242e0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
242f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
24300 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
24310 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f  isabled */.  pro
24320 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  xyClose,        
24330 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
24340 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
24350 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  xyLock,         
24360 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
24370 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
24380 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  yUnlock,        
24390 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
243a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
243b0 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
243c0 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
243d0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
243e0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
243f0 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e  ./* nfs lockd on
24400 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e   OSX 10.3+ doesn
24410 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c  't clear write l
24420 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64  ocks when a read
24430 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a   lock is set */.
24440 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
24450 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
24460 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24470 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
24480 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20  .  nfsIoFinder, 
24490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
244a0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
244b0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f   name */.  nfsIo
244c0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
244d0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
244e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
244f0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24510 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
24520 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
24530 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
24540 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
24550 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
24560 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
24570 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
24580 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
24590 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e  ethod */.  nfsUn
245a0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
245b0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
245c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
245d0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
245e0 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
245f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
24600 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
24610 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
24620 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
24630 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
24640 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
24650 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
24660 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
24670 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
24680 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
24690 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
246a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
246b0 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
246c0 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
246d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
246e0 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
246f0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
24700 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
24710 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d  ** This is for M
24720 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  acOSX only..*/.s
24730 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
24740 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
24750 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
24760 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
24770 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
24780 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
24790 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
247a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
247b0 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  w           /* o
247c0 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
247d0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
247e0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74   file */.){.  st
247f0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
24800 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20  t Mapping {.    
24810 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
24820 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20  esystem;        
24830 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73        /* Filesys
24840 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f  tem type name */
24850 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
24860 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
24870 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70  Methods;   /* Ap
24880 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
24890 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20  g method */.  } 
248a0 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aMap[] = {.    {
248b0 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "hfs",    &posi
248c0 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
248d0 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70    { "ufs",    &p
248e0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
248f0 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20  .    { "afpfs", 
24900 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
24910 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c  ,.    { "smbfs",
24920 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
24930 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76  },.    { "webdav
24940 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  ", &nolockIoMeth
24950 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20  ods },.    { 0, 
24960 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  0 }.  };.  int i
24970 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  ;.  struct statf
24980 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75  s fsInfo;.  stru
24990 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
249a0 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
249b0 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
249c0 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
249d0 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
249e0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
249f0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
24a00 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
24a10 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
24a20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
24a30 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
24a40 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66  ethods;.  }.  if
24a50 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74  ( statfs(filePat
24a60 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d  h, &fsInfo) != -
24a70 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49  1 ){.    if( fsI
24a80 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e  nfo.f_flags & MN
24a90 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  T_RDONLY ){.    
24aa0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
24ab0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
24ac0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d  .    for(i=0; aM
24ad0 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
24ae0 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
24af0 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
24b00 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61  .f_fstypename, a
24b10 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
24b20 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  em)==0 ){.      
24b30 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d    return aMap[i]
24b40 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20  .pMethods;.     
24b50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
24b60 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e  /* Default case.
24b70 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73   Handles, amongs
24b80 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e  t others, "nfs".
24b90 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d  .  ** Test byte-
24ba0 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
24bb0 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65   fcntl(). If the
24bc0 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20   call succeeds, 
24bd0 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
24be0 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
24bf0 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58  m supports POSIX
24c00 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20   style locks. . 
24c10 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
24c20 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
24c30 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
24c40 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
24c50 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
24c60 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
24c70 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
24c80 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
24c90 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
24ca0 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
24cb0 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
24cc0 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
24cd0 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20  name, "nfs")==0 
24ce0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
24cf0 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &nfsIoMethods;. 
24d00 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
24d10 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
24d20 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
24d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
24d40 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65  urn &dotlockIoMe
24d50 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
24d60 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
24d70 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
24d80 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
24d90 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
24da0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
24db0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
24dc0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
24dd0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
24de0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
24df0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
24e00 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f  _STYLE */..#if O
24e10 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
24e20 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
24e30 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
24e40 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
24e50 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
24e60 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
24e70 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
24e80 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
24e90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24ea0 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
24eb0 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
24ec0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
24ed0 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
24ee0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
24ef0 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
24f00 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
24f10 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f  VXWorks only..*/
24f20 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
24f30 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
24f40 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
24f50 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
24f60 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
24f70 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
24f80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24f90 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
24fa0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
24fb0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
24fc0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
24fd0 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
24fe0 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
24ff0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
25000 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
25010 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
25020 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
25030 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
25040 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
25050 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
25060 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
25070 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
25080 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
25090 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
250a0 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
250b0 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
250c0 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
250d0 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
250e0 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
250f0 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
25100 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
25110 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
25120 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
25130 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
25140 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
25150 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
25160 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
25170 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
25180 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
25190 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
251a0 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
251b0 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
251c0 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
251d0 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
251e0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
251f0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
25200 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
25210 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
25220 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
25230 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
25240 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
25250 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
25260 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26   /* OS_VXWORKS &
25270 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
25280 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
25290 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72  ../*.** An abstr
252a0 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70  act type for a p
252b0 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d  ointer to a IO m
252c0 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
252d0 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
252e0 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
252f0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
25300 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
25310 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
25320 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
25330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25370 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
25380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
25390 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
253a0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
253b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
253d0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
253e0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
253f0 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
25400 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
25410 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
25420 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
25430 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
25440 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
25450 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
25460 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
25470 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
25480 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
25490 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
254a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
254b0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
254c0 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
254d0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
254e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
254f0 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
25500 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  ned */.  int syn
25510 63 44 69 72 2c 20 20 20 20 20 20 20 20 20 20 20  cDir,           
25520 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 79 6e 63   /* True to sync
25530 20 64 69 72 65 63 74 6f 72 79 20 6f 6e 20 66 69   directory on fi
25540 72 73 74 20 73 79 6e 63 20 2a 2f 0a 20 20 73 71  rst sync */.  sq
25550 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c  lite3_file *pId,
25560 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
25570 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
25580 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
25590 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
255a0 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
255b0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62  me of the file b
255c0 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
255d0 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20   int noLock,    
255e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74           /* Omit
255f0 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75 65   locking if true
25600 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c 65   */.  int isDele
25610 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
25620 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65   Delete on close
25630 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
25640 74 20 69 73 52 65 61 64 4f 6e 6c 79 20 20 20 20  t isReadOnly    
25650 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25660 20 74 68 65 20 66 69 6c 65 20 69 73 20 6f 70 65   the file is ope
25670 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  ned read-only */
25680 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  .){.  const sqli
25690 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
256a0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
256b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
256c0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49  = (unixFile *)pI
256d0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
256e0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
256f0 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  rt( pNew->pInode
25700 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20  ==NULL );..  /* 
25710 50 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65  Parameter isDele
25720 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  te is only used 
25730 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72  on vxworks. Expr
25740 65 73 73 20 74 68 69 73 20 65 78 70 6c 69 63 69  ess this explici
25750 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74  tly .  ** here t
25760 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c  o prevent compil
25770 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75  er warnings abou
25780 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74  t unused paramet
25790 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53  ers..  */.  UNUS
257a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
257b0 65 6c 65 74 65 29 3b 0a 0a 20 20 2f 2a 20 55 73  elete);..  /* Us
257c0 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a  ually the path z
257d0 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20  Filename should 
257e0 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76  not be a relativ
257f0 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a  e pathname. The.
25800 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69    ** exception i
25810 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  s when opening t
25820 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22  he proxy "conch"
25830 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20   file in builds 
25840 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  that.  ** includ
25850 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70  e the special Ap
25860 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  ple locking styl
25870 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  es..  */.#if def
25880 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
25890 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
258a0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
258b0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
258c0 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
258d0 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20  me[0]=='/' .    
258e0 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74  || pVfs->pAppDat
258f0 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c  a==(void*)&autol
25900 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23  ockIoFinder );.#
25910 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a  else.  assert( z
25920 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
25930 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
25940 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53   );.#endif..  OS
25950 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20  TRACE(("OPEN    
25960 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
25970 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e  Filename));.  pN
25980 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
25990 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65  w->zPath = zFile
259a0 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6d 65 6d 63  name;.  if( memc
259b0 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22  mp(pVfs->zName,"
259c0 75 6e 69 78 2d 65 78 63 6c 22 2c 31 30 29 3d 3d  unix-excl",10)==
259d0 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
259e0 74 72 6c 46 6c 61 67 73 20 3d 20 55 4e 49 58 46  trlFlags = UNIXF
259f0 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 65 6c 73  ILE_EXCL;.  }els
25a00 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  e{.    pNew->ctr
25a10 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a  lFlags = 0;.  }.
25a20 20 20 69 66 28 20 69 73 52 65 61 64 4f 6e 6c 79    if( isReadOnly
25a30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
25a40 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
25a50 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  ILE_RDONLY;.  }.
25a60 20 20 69 66 28 20 73 79 6e 63 44 69 72 20 29 7b    if( syncDir ){
25a70 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
25a80 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
25a90 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 0a 23  _DIRSYNC;.  }..#
25aa0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
25ab0 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f  pNew->pId = vxwo
25ac0 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46  rksFindFileId(zF
25ad0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
25ae0 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a  pNew->pId==0 ){.
25af0 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a      noLock = 1;.
25b00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25b10 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
25b20 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20  f..  if( noLock 
25b30 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
25b40 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
25b50 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
25b60 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
25b70 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
25b80 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
25b90 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
25ba0 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c  , pNew);.#if SQL
25bb0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
25bc0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
25bd0 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  Cache zFilename 
25be0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
25bf0 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20  ontext (AFP and 
25c00 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65  dotlock override
25c10 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f  ) for.    ** pro
25c20 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f  xyLock activatio
25c30 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72  n is possible (r
25c40 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62  emote proxy is b
25c50 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29  ased on db name)
25c60 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .    ** zFilenam
25c70 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  e remains valid 
25c80 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c  until file is cl
25c90 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74  osed, to support
25ca0 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f   */.    pNew->lo
25cb0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28  ckingContext = (
25cc0 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b  void*)zFilename;
25cd0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
25ce0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
25cf0 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68   == &posixIoMeth
25d00 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ods.#if defined(
25d10 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
25d20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
25d30 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c  ING_STYLE.    ||
25d40 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
25d50 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a  = &nfsIoMethods.
25d60 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
25d70 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
25d80 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
25d90 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
25da0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
25db0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25dc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
25dd0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
25de0 75 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64  ured in findInod
25df0 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74  eInfo(), close t
25e00 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
25e10 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65  or.      ** imme
25e20 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20  diately, before 
25e30 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75  releasing the mu
25e40 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  tex. findInodeIn
25e50 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20  fo() may fail.  
25e60 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63      ** in two sc
25e70 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a  enarios:.      *
25e80 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29  *.      **   (a)
25e90 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74   A call to fstat
25ea0 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  () failed..     
25eb0 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c   **   (b) A mall
25ec0 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  oc failed..     
25ed0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65   **.      ** Sce
25ee0 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e  nario (b) may on
25ef0 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20  ly occur if the 
25f00 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
25f10 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20  ng no other.    
25f20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
25f30 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  ptors open on th
25f40 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20  e same file. If 
25f50 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72  there were other
25f60 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
25f70 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68  escriptors on th
25f80 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  is file, then no
25f90 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65   malloc would be
25fa0 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
25fb0 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49     ** findInodeI
25fc0 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69  nfo(). If this i
25fd0 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69  s the case, it i
25fe0 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20  s quite safe to 
25ff0 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  close.      ** h
26000 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20  andle h - as it 
26010 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
26020 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b  at no posix lock
26030 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73  s will be releas
26040 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64  ed.      ** by d
26050 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a  oing so..      *
26060 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63  *.      ** If sc
26070 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65  enario (a) cause
26080 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e  d the error then
26090 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20   things are not 
260a0 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20  so safe. The.   
260b0 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61     ** implicit a
260c0 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69  ssumption here i
260d0 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28  s that if fstat(
260e0 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20  ) fails, things 
260f0 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  are in.      ** 
26100 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74  such bad shape t
26110 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c  hat dropping a l
26120 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e  ock or two doesn
26130 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a  't matter much..
26140 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
26150 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
26160 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
26170 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
26180 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
26190 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23  eMutex();.  }..#
261a0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
261b0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
261c0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
261d0 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  E__).  else if( 
261e0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
261f0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
26200 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63  {.    /* AFP loc
26210 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
26220 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
26230 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
26240 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
26250 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
26260 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  xt..    */.    a
26270 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
26280 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77   *pCtx;.    pNew
26290 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
262a0 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65   = pCtx = sqlite
262b0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
262c0 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69  (*pCtx) );.    i
262d0 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
262e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
262f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
26300 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a  {.      /* NB: z
26310 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20  Filename exists 
26320 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  and remains vali
26330 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65  d until the file
26340 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20   is closed.     
26350 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   ** according to
26360 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31   requirement F11
26370 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  141.  So we do n
26380 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  ot need to make 
26390 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
263a0 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e  of the filename.
263b0 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   */.      pCtx->
263c0 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  dbPath = zFilena
263d0 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  me;.      pCtx->
263e0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
263f0 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29      srandomdev()
26400 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65  ;.      unixEnte
26410 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  rMutex();.      
26420 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
26430 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
26440 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  pInode);.      i
26450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26460 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26470 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c  te3_free(pNew->l
26480 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
26490 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
264a0 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
264b0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
264c0 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d   h = -1;.      }
264d0 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65  .      unixLeave
264e0 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20  Mutex();        
264f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
26500 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  f..  else if( pL
26510 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
26520 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
26530 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69   ){.    /* Dotfi
26540 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  le locking uses 
26550 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
26560 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
26570 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
26580 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f  ** the dotlockLo
26590 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20  ckingContext .  
265a0 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a    */.    char *z
265b0 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e  LockFile;.    in
265c0 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  t nFilename;.   
265d0 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e   nFilename = (in
265e0 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61  t)strlen(zFilena
265f0 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f  me) + 6;.    zLo
26600 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
26610 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
26620 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
26630 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
26640 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
26650 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
26660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
26670 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
26680 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46  Filename, zLockF
26690 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43  ile, "%s" DOTLOC
266a0 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e  K_SUFFIX, zFilen
266b0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
266c0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
266d0 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65  text = zLockFile
266e0 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
266f0 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28  WORKS.  else if(
26700 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
26710 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20  = &semIoMethods 
26720 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20  ){.    /* Named 
26730 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
26740 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
26750 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
26760 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e   to be.    ** in
26770 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65  cluded in the se
26780 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  mLockingContext.
26790 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45      */.    unixE
267a0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
267b0 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
267c0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
267d0 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
267e0 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
267f0 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f  ) && (pNew->pIno
26800 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20  de->pSem==NULL) 
26810 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
26820 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
26830 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
26840 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
26850 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
26860 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
26870 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f  ME, zSemName, "/
26880 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20  %s.sem",.       
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268a0 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  pNew->pId->zCano
268b0 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
268c0 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d    for( n=1; zSem
268d0 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20  Name[n]; n++ ). 
268e0 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e         if( zSemN
268f0 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53  ame[n]=='/' ) zS
26900 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b  emName[n] = '_';
26910 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  .      pNew->pIn
26920 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  ode->pSem = sem_
26930 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
26940 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
26950 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
26960 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
26970 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
26980 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26990 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
269a0 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
269b0 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
269c0 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
269d0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
269e0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
269f0 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c  dif.  .  pNew->l
26a00 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69  astErrno = 0;.#i
26a10 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
26a20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26a30 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
26a40 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
26a50 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
26a60 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a  _);.    h = -1;.
26a70 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69      osUnlink(zFi
26a80 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44  lename);.    isD
26a90 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  elete = 0;.  }. 
26aa0 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20   pNew->isDelete 
26ab0 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64  = isDelete;.#end
26ac0 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
26ad0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
26ae0 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
26af0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
26b00 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73  _LINE__);.  }els
26b10 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
26b20 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53  thod = pLockingS
26b30 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  tyle;.    OpenCo
26b40 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20  unter(+1);.  }. 
26b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26b60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
26b70 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74  name of a direct
26b80 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ory in which to 
26b90 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69  put temporary fi
26ba0 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  les..** If no su
26bb0 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79  itable temporary
26bc0 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20   file directory 
26bd0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
26be0 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
26bf0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
26c00 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72  *unixTempFileDir
26c10 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
26c20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
26c30 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
26c40 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
26c50 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
26c60 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
26c70 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20   "/tmp",.     0 
26c80 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
26c90 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d  erminator */.  }
26ca0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
26cb0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
26cc0 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
26cd0 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
26ce0 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
26cf0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
26d00 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44  tory;.  if( !azD
26d10 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
26d20 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
26d30 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  DIR");.  for(i=0
26d40 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
26d50 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
26d60 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
26d70 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28  s[i++]){.    if(
26d80 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
26d90 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53  nue;.    if( osS
26da0 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
26db0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
26dc0 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
26dd0 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
26de0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
26df0 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29  Access(zDir, 07)
26e00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
26e10 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
26e20 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a  turn zDir;.}../*
26e30 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
26e40 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
26e50 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
26e60 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
26e70 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
26e80 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
26e90 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
26ea0 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
26eb0 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
26ec0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
26ed0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
26ee0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
26ef0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
26f00 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
26f10 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
26f20 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
26f30 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
26f40 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
26f50 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
26f60 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
26f70 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
26f80 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
26f90 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  , j;.  const cha
26fa0 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49  r *zDir;..  /* I
26fb0 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
26fc0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
26fd0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
26fe0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
26ff0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
27000 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
27010 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
27020 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
27030 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
27040 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
27050 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
27060 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
27070 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
27080 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  zDir = unixTempF
27090 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20  ileDir();.  if( 
270a0 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d  zDir==0 ) zDir =
270b0 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   ".";..  /* Chec
270c0 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
270d0 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
270e0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
270f0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
27100 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
27110 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
27120 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
27130 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65   */.  if( (strle
27140 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e  n(zDir) + strlen
27150 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
27160 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20  E_PREFIX) + 17) 
27170 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
27180 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27190 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
271a0 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
271b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
271c0 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -17, zBuf, "%s/"
271d0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
271e0 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
271f0 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72      j = (int)str
27200 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
27210 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
27220 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
27230 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27240 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
27250 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
27260 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
27270 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
27280 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
27290 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
272a0 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
272b0 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41  0;.  }while( osA
272c0 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
272d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
272e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
272f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
27300 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
27310 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
27320 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
27330 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
27340 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
27350 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
27360 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
27370 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
27380 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
27390 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
273a0 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
273b0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
273c0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
273d0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
273e0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
273f0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
27400 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
27410 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
27420 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
27430 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
27440 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
27450 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
27460 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
27470 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
27480 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
27490 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
274a0 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
274b0 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
274c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
274d0 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
274e0 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
274f0 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
27500 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
27510 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
27520 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
27530 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
27540 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
27550 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
27560 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
27570 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
27580 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
27590 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
275a0 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
275b0 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
275c0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
275d0 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
275e0 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
275f0 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
27600 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
27610 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
27620 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
27630 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
27640 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
27650 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
27660 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
27670 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
27680 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
27690 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
276a0 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
276b0 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
276c0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
276d0 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
276e0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
276f0 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
27700 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
27710 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
27720 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
27730 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
27740 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
27750 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
27760 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
27770 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
27780 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
27790 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
277a0 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
277b0 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
277c0 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
277d0 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
277e0 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
277f0 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
27800 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
27810 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
27820 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
27830 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
27840 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
27850 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
27860 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
27870 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
27880 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
27890 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
278a0 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
278b0 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
278c0 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
278d0 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
278e0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
278f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
27900 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
27910 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
27920 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
27930 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
27940 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
27950 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
27960 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
27970 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
27980 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
27990 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
279a0 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
279b0 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
279c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
279d0 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
279e0 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
279f0 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
27a00 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
27a10 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
27a20 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
27a30 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
27a40 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
27a50 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
27a60 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
27a70 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
27a80 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
27a90 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
27aa0 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
27ab0 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
27ac0 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
27ad0 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
27ae0 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66  or a resusable f
27af0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
27b00 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
27b10 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74  .  if( 0==osStat
27b20 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
27b30 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65  ){.    unixInode
27b40 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20  Info *pInode;.. 
27b50 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
27b60 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20  x();.    pInode 
27b70 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
27b80 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
27b90 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  & (pInode->fileI
27ba0 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f  d.dev!=sStat.st_
27bb0 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20  dev.            
27bc0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f           || pIno
27bd0 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d  de->fileId.ino!=
27be0 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b  sStat.st_ino) ){
27bf0 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d  .       pInode =
27c00 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
27c10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
27c20 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e  node ){.      Un
27c30 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
27c40 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
27c50 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
27c60 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c  *pp && (*pp)->fl
27c70 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26  ags!=flags; pp=&
27c80 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
27c90 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
27ca0 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20   *pp;.      if( 
27cb0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
27cc0 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64     *pp = pUnused
27cd0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
27ce0 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
27cf0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
27d00 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66  .#endif    /* if
27d10 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a   !OS_VXWORKS */.
27d20 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64    return pUnused
27d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
27d40 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
27d50 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
27d60 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
27d70 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f  e unix permissio
27d80 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20  ns.** to create 
27d90 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20  new files with. 
27da0 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
27db0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
27dc0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
27dd0 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75  * and a value su
27de0 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69  itable for passi
27df0 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ng as the third 
27e00 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e  argument to open
27e10 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65  (2) is.** writte
27e20 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20  n to *pMode. If 
27e30 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
27e40 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
27e50 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
27e60 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
27e70 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65   value of *pMode
27e80 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64   is not modified
27e90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
27ea0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
27eb0 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
27ec0 66 69 6c 65 2c 20 69 74 20 69 73 20 61 6c 77 61  file, it is alwa
27ed0 79 73 20 63 72 65 61 74 65 64 20 77 69 74 68 0a  ys created with.
27ee0 2a 2a 20 74 68 65 20 6f 63 74 61 6c 20 70 65 72  ** the octal per
27ef0 6d 69 73 73 69 6f 6e 73 20 30 36 30 30 20 28 72  missions 0600 (r
27f00 65 61 64 2f 77 72 69 74 61 62 6c 65 20 62 79 20  ead/writable by 
27f10 6f 77 6e 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20  owner only). If 
27f20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
27f30 20 64 61 74 61 62 61 73 65 20 6f 72 20 6d 61 73   database or mas
27f40 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
27f50 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
27f60 77 69 74 68 20 74 68 65 20 70 65 72 6d 69 73 73  with the permiss
27f70 69 6f 6e 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51  ions .** mask SQ
27f80 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
27f90 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a  E_PERMISSIONS..*
27fa0 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  *.** Finally, if
27fb0 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
27fc0 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20  opened is a WAL 
27fd0 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  or regular journ
27fe0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a  al file, then .*
27ff0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
28000 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65  queries the file
28010 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
28020 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
28030 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
28040 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ding database fi
28050 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f  le and sets *pMo
28060 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  de to this value
28070 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70  . Whenever .** p
28080 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64  ossible, WAL and
28090 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61   journal files a
280a0 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  re created using
280b0 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
280c0 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65  sions .** as the
280d0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
280e0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
280f0 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45   If the SQLITE_E
28100 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
28110 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
28120 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f  d, then the.** o
28130 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
28140 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   is unavailable.
28150 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20    But 8_3_NAMES 
28160 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
28170 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74  .** FAT filesyst
28180 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69  ems and permissi
28190 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65  ons do not matte
281a0 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74  r there, so just
281b0 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61   use.** the defa
281c0 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ult permissions.
281d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
281e0 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
281f0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
28200 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
28210 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
28220 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20  file (possibly) 
28230 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f  being created */
28240 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
28250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28260 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
28270 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65  ed as 4th argume
28280 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f  nt to xOpen() */
28290 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65  .  mode_t *pMode
282a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282b0 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69     /* OUT: Permi
282c0 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66  ssions to open f
282d0 69 6c 65 20 77 69 74 68 20 2a 2f 0a 29 7b 0a 20  ile with */.){. 
282e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
282f0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
28300 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
28310 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 53 51  */.  *pMode = SQ
28320 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
28330 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20  E_PERMISSIONS;. 
28340 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
28350 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
28360 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
28370 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63  OURNAL) ){.    c
28380 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48  har zDb[MAX_PATH
28390 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20  NAME+1];     /* 
283a0 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  Database file pa
283b0 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44  th */.    int nD
283c0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
283d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
283e0 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73  r of valid bytes
283f0 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73   in zDb */.    s
28400 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
28410 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
28420 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29  Output of stat()
28430 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
28440 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61  e */..    /* zPa
28450 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20  th is a path to 
28460 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c  a WAL or journal
28470 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f   file. The follo
28480 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76  wing block deriv
28490 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  es.    ** the pa
284a0 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69  th to the associ
284b0 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
284c0 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54  le from zPath. T
284d0 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65  his block handle
284e0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c  s.    ** the fol
284f0 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f  lowing naming co
28500 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a  nventions:.    *
28510 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  *.    **   "<pat
28520 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
28530 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
28540 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20  h to db>-wal".  
28550 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
28560 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a   db>-journalNN".
28570 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
28580 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20  to db>-walNN".  
28590 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72    **.    ** wher
285a0 65 20 4e 4e 20 69 73 20 61 20 34 20 64 69 67 69  e NN is a 4 digi
285b0 74 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72  t decimal number
285c0 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20  . The NN naming 
285d0 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
285e0 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
285f0 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
28600 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
28610 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
28620 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
28630 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65   - 1; .    while
28640 28 20 6e 44 62 3e 30 20 26 26 20 7a 50 61 74 68  ( nDb>0 && zPath
28650 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 6e 44 62  [nDb]!='-' ) nDb
28660 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d  --;.    if( nDb=
28670 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
28680 54 45 5f 4f 4b 3b 0a 20 20 20 20 6d 65 6d 63 70  TE_OK;.    memcp
28690 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44  y(zDb, zPath, nD
286a0 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d  b);.    zDb[nDb]
286b0 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66   = '\0';..    if
286c0 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c  ( 0==osStat(zDb,
286d0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
286e0 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74    *pMode = sStat
286f0 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b  .st_mode & 0777;
28700 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28710 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
28720 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
28730 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
28740 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
28750 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29  _DELETEONCLOSE )
28760 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30  {.    *pMode = 0
28770 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  600;.  }.  retur
28780 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
28790 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61  pen the file zPa
287a0 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69  th..** .** Previ
287b0 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74  ously, the SQLit
287c0 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20  e OS layer used 
287d0 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20  three functions 
287e0 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73  in place of this
287f0 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** one:.**.**  
28800 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
28810 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20  ReadWrite();.** 
28820 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
28830 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20  nReadOnly();.** 
28840 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
28850 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a  nExclusive();.**
28860 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20  .** These calls 
28870 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
28880 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
28890 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67  inations of flag
288a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61  s:.**.**     Rea
288b0 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20  dWrite() ->     
288c0 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
288d0 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64  ATE).**     Read
288e0 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28  Only()  ->     (
288f0 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20  READONLY) .**   
28900 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28    OpenExclusive(
28910 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20  ) -> (READWRITE 
28920 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55  | CREATE | EXCLU
28930 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SIVE).**.** The 
28940 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  old OpenExclusiv
28950 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62  e() accepted a b
28960 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20  oolean argument 
28970 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a  - "delFlag". If.
28980 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c  ** true, the fil
28990 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64  e was configured
289a0 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63   to be automatic
289b0 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
289c0 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61  n the.** file ha
289d0 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20  ndle closed. To 
289e0 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65  achieve the same
289f0 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68   effect using th
28a00 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72  is new .** inter
28a10 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45  face, add the DE
28a20 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67  LETEONCLOSE flag
28a30 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
28a40 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a  ied above for .*
28a50 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  * OpenExclusive(
28a60 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
28a70 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c   unixOpen(.  sql
28a80 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
28a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28aa0 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74   VFS for which t
28ab0 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e  his is the xOpen
28ac0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
28ad0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
28ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
28af0 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f  hname of file to
28b00 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
28b10 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
28b20 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ile,         /* 
28b30 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
28b40 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  tor to be filled
28b50 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   in */.  int fla
28b60 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
28b70 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66        /* Input f
28b80 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
28b90 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20  the opening */. 
28ba0 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28bc0 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65   Output flags re
28bd0 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
28be0 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   core */.){.  un
28bf0 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
28c00 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  xFile *)pFile;. 
28c10 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20   int fd = -1;   
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
28c40 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f  or returned by o
28c50 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  pen() */.  int o
28c60 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  penFlags = 0;   
28c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
28c80 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70  gs to pass to op
28c90 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54  en() */.  int eT
28ca0 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
28cb0 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
28cc0 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
28cd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b   */.  int noLock
28ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28cf0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
28d00 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69  omit locking pri
28d10 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74  mitives */.  int
28d20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28d40 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
28d50 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73  ode */..  int is
28d60 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
28d70 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
28d80 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
28d90 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
28da0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
28db0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
28dc0 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
28dd0 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
28de0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
28df0 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74  N_CREATE);.  int
28e00 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
28e10 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
28e20 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
28e30 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
28e40 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
28e50 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
28e60 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ITE);.#if SQLITE
28e70 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
28e80 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75  STYLE.  int isAu
28e90 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67  toProxy  = (flag
28ea0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
28eb0 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64  AUTOPROXY);.#end
28ec0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
28ed0 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
28ee0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
28ef0 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63  NG_STYLE.  struc
28f00 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
28f10 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
28f20 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
28f30 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
28f40 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
28f50 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
28f60 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
28f70 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
28f80 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
28f90 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
28fa0 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
28fb0 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
28fc0 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
28fd0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
28fe0 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
28ff0 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
29000 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65  syncDir = (isCre
29010 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
29020 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
29030 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
29040 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
29050 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
29060 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
29070 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
29080 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
29090 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
290a0 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
290b0 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
290c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
290d0 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
290e0 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
290f0 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
29100 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
29110 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
29120 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
29130 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
29140 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+1];.  const c
29150 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
29160 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
29170 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
29180 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
29190 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
291a0 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
291b0 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
291c0 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
291d0 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
291e0 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
291f0 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
29200 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
29210 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
29220 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
29230 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
29240 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
29250 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
29260 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
29270 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
29280 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
29290 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
292a0 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
292b0 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
292c0 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
292d0 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
292e0 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
292f0 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
29300 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
29310 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
29320 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
29330 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
29340 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
29350 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
29360 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
29370 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
29380 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
29390 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
293a0 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
293b0 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
293c0 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
293d0 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
293e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
293f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
29400 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
29410 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
29420 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
29430 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
29440 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
29450 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
29460 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
29470 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
29480 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
29490 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
294a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
294b0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
294c0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
294d0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
294e0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
294f0 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
29500 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
29510 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
29520 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
29530 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
29540 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
29550 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29560 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
29570 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
29580 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
29590 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
295a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
295b0 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
295c0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
295d0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
295e0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
295f0 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
29600 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
29610 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
29620 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
29630 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
29640 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
29650 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
29660 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
29670 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  .  );..  memset(
29680 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  p, 0, sizeof(uni
29690 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20  xFile));..  if( 
296a0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
296b0 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
296c0 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
296d0 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e  pUnused;.    pUn
296e0 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
296f0 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61  bleFd(zName, fla
29700 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  gs);.    if( pUn
29710 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64  used ){.      fd
29720 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
29730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29740 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
29750 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
29760 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
29770 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
29780 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
29790 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
297a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
297b0 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70    p->pUnused = p
297c0 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20  Unused;.  }else 
297d0 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
297e0 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
297f0 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72   NULL, the upper
29800 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73   layer is reques
29810 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65  ting a temp file
29820 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
29830 69 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e  isDelete && !syn
29840 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  cDir);.    rc = 
29850 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
29860 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20  MAX_PATHNAME+1, 
29870 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
29880 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29890 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
298a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
298b0 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
298c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72  .  }..  /* Deter
298d0 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f  mine the value o
298e0 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  f the flags para
298f0 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
29900 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20  POSIX function. 
29910 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73   ** open(). Thes
29920 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c  e must be calcul
29930 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65  ated even if ope
29940 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
29950 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20  d, as.  ** they 
29960 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
29970 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
29980 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65  e handle and use
29990 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27  d by the .  ** '
299a0 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b  conch file' lock
299b0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61  ing functions la
299c0 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66  ter on.  */.  if
299d0 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
299e0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
299f0 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52  DONLY;.  if( isR
29a00 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46  eadWrite ) openF
29a10 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a  lags |= O_RDWR;.
29a20 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
29a30 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
29a40 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20   O_CREAT;.  if( 
29a50 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70  isExclusive ) op
29a60 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58  enFlags |= (O_EX
29a70 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a  CL|O_NOFOLLOW);.
29a80 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28    openFlags |= (
29a90 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
29aa0 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64  NARY);..  if( fd
29ab0 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74  <0 ){.    mode_t
29ac0 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20   openMode;      
29ad0 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69          /* Permi
29ae0 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65  ssions to create
29af0 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
29b00 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74    rc = findCreat
29b10 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c  eFileMode(zName,
29b20 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64   flags, &openMod
29b30 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
29b40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29b50 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70     assert( !p->p
29b60 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20  Unused );.      
29b70 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
29b80 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c  QLITE_OPEN_WAL |
29b90 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
29ba0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
29bb0 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L );.      retur
29bc0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
29bd0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
29be0 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
29bf0 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
29c00 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
29c10 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c  X   %-3d %s 0%o\
29c20 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f  n", fd, zName, o
29c30 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  penFlags));.    
29c40 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
29c50 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52  o!=EISDIR && isR
29c60 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
29c70 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
29c80 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f    /* Failed to o
29c90 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72  pen the file for
29ca0 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
29cb0 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c  ss. Try read-onl
29cc0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67  y. */.      flag
29cd0 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50  s &= ~(SQLITE_OP
29ce0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
29cf0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
29d00 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
29d10 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f  s &= ~(O_RDWR|O_
29d20 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c  CREAT);.      fl
29d30 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
29d40 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
29d50 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
29d60 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  O_RDONLY;.      
29d70 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  isReadonly = 1;.
29d80 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73        fd = robus
29d90 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  t_open(zName, op
29da0 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
29db0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
29dc0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
29dd0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
29de0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
29df0 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
29e00 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
29e10 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
29e20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
29e30 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20  sert( fd>=0 );. 
29e40 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
29e50 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73  {.    *pOutFlags
29e60 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
29e70 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20   if( p->pUnused 
29e80 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  ){.    p->pUnuse
29e90 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20  d->fd = fd;.    
29ea0 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  p->pUnused->flag
29eb0 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
29ec0 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
29ed0 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
29ee0 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61  .    zPath = zNa
29ef0 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73  me;.#else.    os
29f00 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23  Unlink(zName);.#
29f10 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51  endif.  }.#if SQ
29f20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
29f30 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65  ING_STYLE.  else
29f40 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61  {.    p->openFla
29f50 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
29f60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
29f70 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
29f80 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45  osFcntl(fd, F_SE
29f90 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c  TFD, osFcntl(fd,
29fa0 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46   F_GETFD, 0) | F
29fb0 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64  D_CLOEXEC);.#end
29fc0 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65  if..  noLock = e
29fd0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
29fe0 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23  N_MAIN_DB;..  .#
29ff0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2a000 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
2a010 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2a020 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74  TYLE.  if( fstat
2a030 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20  fs(fd, &fsInfo) 
2a040 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75  == -1 ){.    ((u
2a050 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
2a060 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
2a070 6e 6f 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  no;.    robust_c
2a080 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
2a090 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72  NE__);.    retur
2a0a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
2a0b0 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20  CCESS;.  }.  if 
2a0c0 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d  (0 == strncmp("m
2a0d0 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  sdos", fsInfo.f_
2a0e0 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
2a0f0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
2a100 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
2a110 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
2a120 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
2a130 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20  }.#endif.  .#if 
2a140 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2a150 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20  CKING_STYLE.#if 
2a160 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2a170 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73  OXY_LOCKING.  is
2a180 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23  AutoProxy = 1;.#
2a190 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75  endif.  if( isAu
2a1a0 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74  toProxy && (zPat
2a1b0 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f  h!=NULL) && (!no
2a1c0 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78  Lock) && pVfs->x
2a1d0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  Open ){.    char
2a1e0 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
2a1f0 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
2a200 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
2a210 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
2a220 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
2a230 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
2a240 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
2a250 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
2a260 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d  s use proxy, 0 m
2a270 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76  eans .    ** nev
2a280 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
2a290 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
2a2a0 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
2a2b0 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f   files only.  */
2a2c0 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63  .    if( envforc
2a2d0 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e!=NULL ){.     
2a2e0 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69   useProxy = atoi
2a2f0 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20  (envforce)>0;.  
2a300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2a310 66 28 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c  f( statfs(zPath,
2a320 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
2a330 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
2a340 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f   theory, the clo
2a350 73 65 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73  se(fd) call is s
2a360 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74  ub-optimal. If t
2a370 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20  he file opened. 
2a380 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66         ** with f
2a390 64 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  d is a database 
2a3a0 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
2a3b0 61 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  are other connec
2a3c0 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20  tions open.     
2a3d0 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69     ** on that fi
2a3e0 6c 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  le that are curr
2a3f0 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64  ently holding ad
2a400 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20  visory locks on 
2a410 69 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  it,.        ** t
2a420 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hen the call to 
2a430 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e  close() will can
2a440 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  cel those locks.
2a450 20 49 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20   In practice,.  
2a460 20 20 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61        ** we're a
2a470 73 73 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61  ssuming that sta
2a480 74 66 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61  tfs() doesn't fa
2a490 69 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41  il very often. A
2a4a0 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
2a4b0 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68  ** not while oth
2a4c0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
2a4d0 6f 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ors opened by th
2a4e0 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f  e same process o
2a4f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
2a500 20 73 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77   same file are w
2a510 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20  orking.  */.    
2a520 20 20 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f      p->lastErrno
2a530 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
2a540 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2a550 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2a560 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2a570 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
2a580 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  S;.        goto 
2a590 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
2a5a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65       }.      use
2a5b0 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f  Proxy = !(fsInfo
2a5c0 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43  .f_flags&MNT_LOC
2a5d0 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  AL);.    }.    i
2a5e0 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20  f( useProxy ){. 
2a5f0 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e       rc = fillIn
2a600 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
2a610 64 2c 20 73 79 6e 63 44 69 72 2c 20 70 46 69 6c  d, syncDir, pFil
2a620 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b  e, zPath, noLock
2a630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a640 20 20 20 20 20 20 20 20 20 20 20 20 69 73 44 65              isDe
2a650 6c 65 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79  lete, isReadonly
2a660 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2a670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a680 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
2a690 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
2a6a0 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69  e((unixFile*)pFi
2a6b0 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20  le, ":auto:");. 
2a6c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2a6d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a6e0 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69        /* Use uni
2a6f0 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20  xClose to clean 
2a700 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  up the resources
2a710 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e   added in fillIn
2a720 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20  UnixFile .      
2a730 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72      ** and clear
2a740 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75   all the structu
2a750 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e  re's references.
2a760 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
2a770 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46  .          ** pF
2a780 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69  ile->pMethods wi
2a790 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71  ll be NULL so sq
2a7a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c  lite3OsClose wil
2a7b0 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20  l be a no-op .  
2a7c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2a7d0 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70       unixClose(p
2a7e0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
2a7f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a800 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2a810 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
2a820 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
2a830 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63  }.#endif.  .  rc
2a840 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
2a850 65 28 70 56 66 73 2c 20 66 64 2c 20 73 79 6e 63  e(pVfs, fd, sync
2a860 44 69 72 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74  Dir, pFile, zPat
2a870 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20  h, noLock,.     
2a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a890 20 69 73 44 65 6c 65 74 65 2c 20 69 73 52 65 61   isDelete, isRea
2a8a0 64 6f 6e 6c 79 29 3b 0a 6f 70 65 6e 5f 66 69 6e  donly);.open_fin
2a8b0 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ished:.  if( rc!
2a8c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a8d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2a8e0 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a  ->pUnused);.  }.
2a8f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a900 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
2a910 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e  e file at zPath.
2a920 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20   If the dirSync 
2a930 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
2a940 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65  , fsync().** the
2a950 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
2a960 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69   deleting the fi
2a970 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2a980 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20  t unixDelete(.  
2a990 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2a9a0 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53  Used,     /* VFS
2a9b0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
2a9c0 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20   as the xDelete 
2a9d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
2a9e0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2a9f0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2aa00 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
2aa10 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  ted */.  int dir
2aa20 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
2aa30 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66     /* If true, f
2aa40 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79  sync() directory
2aa50 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
2aa60 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
2aa70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2aa80 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2aa90 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2aaa0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2aab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2aac0 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69  ERR_DELETE);.  i
2aad0 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74  f( osUnlink(zPat
2aae0 68 29 3d 3d 28 2d 31 29 20 26 26 20 65 72 72 6e  h)==(-1) && errn
2aaf0 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20  o!=ENOENT ){.   
2ab00 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
2ab10 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
2ab20 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e  R_DELETE, "unlin
2ab30 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  k", zPath);.  }.
2ab40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
2ab50 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20  ISABLE_DIRSYNC. 
2ab60 20 69 66 28 20 64 69 72 53 79 6e 63 20 29 7b 0a   if( dirSync ){.
2ab70 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
2ab80 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
2ab90 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
2aba0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2abb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f  LITE_OK ){.#if O
2abc0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
2abd0 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d  if( fsync(fd)==-
2abe0 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  1 ).#else.      
2abf0 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a  if( fsync(fd) ).
2ac00 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
2ac10 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
2ac20 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2ac30 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c  IOERR_DIR_FSYNC,
2ac40 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29   "fsync", zPath)
2ac50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ac60 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
2ac70 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2ac80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
2ac90 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
2aca0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2acb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2acc0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2acd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ace0 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74 61   Test the exista
2acf0 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73  nce of or access
2ad00 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
2ad10 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a  file zPath. The.
2ad20 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65  ** test performe
2ad30 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
2ad40 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a   value of flags:
2ad50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
2ad60 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
2ad70 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
2ad80 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20   file exists.** 
2ad90 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
2ada0 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74  S_READWRITE: Ret
2adb0 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
2adc0 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72  e is read and wr
2add0 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53  itable..**     S
2ade0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
2adf0 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20  DONLY: Return 1 
2ae00 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
2ae10 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  eadable..**.** O
2ae20 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
2ae30 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
2ae40 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73   unixAccess(.  s
2ae50 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2ae60 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46  sed,   /* The VF
2ae70 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
2ae80 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64  s xAccess method
2ae90 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2aea0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a   *zPath,      /*
2aeb0 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c   Path of the fil
2aec0 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a  e to examine */.
2aed0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2aee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
2aef0 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20  t do we want to 
2af00 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20  learn about the 
2af10 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20  zPath file? */. 
2af20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
2af30 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2af40 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e  e result boolean
2af50 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2af60 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55  t amode = 0;.  U
2af70 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2af80 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
2af90 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
2afa0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2afb0 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77  _ACCESS; );.  sw
2afc0 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
2afd0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2afe0 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
2aff0 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b      amode = F_OK
2b000 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2b010 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2b020 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
2b030 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57  .      amode = W
2b040 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  _OK|R_OK;.      
2b050 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2b060 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
2b070 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  AD:.      amode 
2b080 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = R_OK;.      br
2b090 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
2b0a0 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
2b0b0 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
2b0c0 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
2b0d0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73    *pResOut = (os
2b0e0 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d  Access(zPath, am
2b0f0 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20  ode)==0);.  if( 
2b100 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
2b110 43 45 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a  CESS_EXISTS && *
2b120 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73  pResOut ){.    s
2b130 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2b140 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61      if( 0==osSta
2b150 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26  t(zPath, &buf) &
2b160 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  & buf.st_size==0
2b170 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f   ){.      *pResO
2b180 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ut = 0;.    }.  
2b190 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2b1a0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
2b1b0 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
2b1c0 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
2b1d0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54  full pathname. T
2b1e0 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
2b1f0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73  .** is stored as
2b200 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
2b210 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  d string in the 
2b220 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
2b230 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a  o by.** zPath. .
2b240 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74  **.** zOut point
2b250 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  s to a buffer of
2b260 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65   at least sqlite
2b270 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
2b280 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74   bytes .** (in t
2b290 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41  his case, MAX_PA
2b2a0 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54  THNAME bytes). T
2b2b0 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20  he full-path is 
2b2c0 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68  written to.** th
2b2d0 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  is buffer before
2b2e0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
2b2f0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75  tatic int unixFu
2b300 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
2b310 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2b320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b330 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
2b340 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
2b350 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2b360 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
2b370 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
2b380 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
2b390 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
2b3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2b3b0 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
2b3c0 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
2b3d0 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20    char *zOut    
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3f0 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
2b400 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27   */.){..  /* It'
2b410 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
2b420 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
2b430 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
2b440 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
2b450 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
2b460 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
2b470 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
2b480 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
2b490 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
2b4a0 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
2b4b0 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
2b4c0 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
2b4d0 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
2b4e0 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
2b4f0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
2b500 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
2b510 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
2b520 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
2b530 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73  _ERROR );..  ass
2b540 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ert( pVfs->mxPat
2b550 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e  hname==MAX_PATHN
2b560 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  AME );.  UNUSED_
2b570 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2b580 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d  ..  zOut[nOut-1]
2b590 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a   = '\0';.  if( z
2b5a0 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[0]=='/' ){.
2b5b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2b5c0 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c  intf(nOut, zOut,
2b5d0 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
2b5e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
2b5f0 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 6f 73  nCwd;.    if( os
2b600 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75  Getcwd(zOut, nOu
2b610 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1)==0 ){.     
2b620 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
2b630 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
2b640 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63  OPEN_BKPT, "getc
2b650 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  wd", zPath);.   
2b660 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69   }.    nCwd = (i
2b670 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b  nt)strlen(zOut);
2b680 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2b690 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c  rintf(nOut-nCwd,
2b6a0 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f   &zOut[nCwd], "/
2b6b0 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
2b6c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2b6d0 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  _OK;.}...#ifndef
2b6e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
2b6f0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
2b700 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
2b710 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
2b720 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
2b730 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
2b740 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
2b750 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
2b760 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
2b770 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
2b780 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e  .#include <dlfcn
2b790 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .h>.static void 
2b7a0 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69  *unixDlOpen(sqli
2b7b0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2b7c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
2b7d0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53  ilename){.  UNUS
2b7e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2b7f0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
2b800 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
2b810 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
2b820 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a  D_GLOBAL);.}../*
2b830 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  .** SQLite calls
2b840 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2b850 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
2b860 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44   a call to unixD
2b870 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69  lSym() or.** uni
2b880 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20  xDlOpen() fails 
2b890 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20  (returns a null 
2b8a0 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d  pointer). If a m
2b8b0 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72  ore detailed err
2b8c0 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73  or.** message is
2b8d0 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69   available, it i
2b8e0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75  s written to zBu
2b8f0 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f  fOut. If no erro
2b900 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
2b910 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f  available, zBufO
2b920 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ut is left unmod
2b930 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65  ified and SQLite
2b940 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a   uses a default.
2b950 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
2b960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2b970 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c   unixDlError(sql
2b980 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2b990 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
2b9a0 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63  r *zBufOut){.  c
2b9b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
2b9c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2b9d0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2b9e0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2b9f0 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
2ba00 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
2ba10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2ba20 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
2ba30 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
2ba40 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
2ba50 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
2ba60 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
2ba70 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
2ba80 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
2ba90 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
2baa0 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
2bab0 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
2bac0 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
2bad0 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
2bae0 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
2baf0 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
2bb00 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
2bb10 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
2bb20 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
2bb30 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
2bb40 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
2bb50 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
2bb60 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
2bb70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2bb80 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
2bb90 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
2bba0 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
2bbb0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
2bbc0 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
2bbd0 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
2bbe0 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
2bbf0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
2bc00 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
2bc10 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
2bc20 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
2bc30 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
2bc40 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
2bc50 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
2bc60 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
2bc70 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
2bc80 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
2bc90 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
2bca0 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
2bcb0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
2bcc0 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
2bcd0 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
2bce0 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
2bcf0 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
2bd00 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
2bd10 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
2bd20 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
2bd30 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
2bd40 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
2bd50 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
2bd60 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
2bd70 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
2bd80 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
2bd90 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
2bda0 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
2bdb0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
2bdc0 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
2bdd0 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
2bde0 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
2bdf0 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
2be00 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
2be10 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
2be20 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
2be30 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2be40 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
2be50 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
2be60 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
2be70 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
2be80 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
2be90 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
2bea0 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
2beb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2bec0 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
2bed0 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
2bee0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2bef0 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
2bf00 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
2bf10 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
2bf20 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
2bf30 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
2bf40 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
2bf50 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
2bf60 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
2bf70 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
2bf80 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
2bf90 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
2bfa0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
2bfb0 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
2bfc0 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
2bfd0 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
2bfe0 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
2bff0 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
2c000 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
2c010 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
2c020 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2c030 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2c040 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2c050 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
2c060 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
2c070 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
2c080 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
2c090 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
2c0a0 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
2c0b0 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
2c0c0 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
2c0d0 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
2c0e0 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
2c0f0 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
2c100 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
2c110 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
2c120 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
2c130 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
2c140 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
2c150 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
2c160 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
2c170 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
2c180 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
2c190 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
2c1a0 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
2c1b0 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
2c1c0 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
2c1d0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
2c1e0 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
2c1f0 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
2c200 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
2c210 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
2c220 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
2c230 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
2c240 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
2c250 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
2c260 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
2c270 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
2c280 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
2c290 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
2c2a0 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
2c2b0 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
2c2c0 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
2c2d0 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
2c2e0 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
2c2f0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
2c300 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
2c310 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
2c320 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
2c330 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b      int pid, fd;
2c340 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
2c350 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e  _open("/dev/uran
2c360 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  dom", O_RDONLY, 
2c370 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  0);.    if( fd<0
2c380 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
2c390 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
2c3a0 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
2c3b0 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
2c3c0 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64  f(t));.      pid
2c3d0 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20   = getpid();.   
2c3e0 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
2c3f0 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64  sizeof(t)], &pid
2c400 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
2c410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
2c420 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70  zeof(t)+sizeof(p
2c430 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75  id)<=(size_t)nBu
2c440 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20  f );.      nBuf 
2c450 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69  = sizeof(t) + si
2c460 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d  zeof(pid);.    }
2c470 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20  else{.      do{ 
2c480 6e 42 75 66 20 3d 20 6f 73 52 65 61 64 28 66 64  nBuf = osRead(fd
2c490 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d  , zBuf, nBuf); }
2c4a0 77 68 69 6c 65 28 20 6e 42 75 66 3c 30 20 26 26  while( nBuf<0 &&
2c4b0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
2c4c0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
2c4d0 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
2c4e0 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E__);.    }.  }.
2c4f0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2c500 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
2c510 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
2c520 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
2c530 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
2c540 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
2c550 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
2c560 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
2c570 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
2c580 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
2c590 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2c5a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2c5b0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
2c5c0 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
2c5d0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
2c5e0 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
2c5f0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
2c600 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
2c610 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
2c620 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
2c630 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
2c640 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
2c650 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
2c660 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
2c670 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
2c680 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2c690 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
2c6a0 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
2c6b0 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
2c6c0 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
2c6d0 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
2c6e0 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
2c6f0 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
2c700 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
2c710 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
2c720 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
2c730 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
2c740 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2c750 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
2c760 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
2c770 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
2c780 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
2c790 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
2c7a0 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
2c7b0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2c7c0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2c7d0 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
2c7e0 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
2c7f0 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
2c800 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
2c810 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
2c820 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
2c830 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2c840 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
2c850 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
2c860 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
2c870 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2c880 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
2c890 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
2c8a0 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
2c8b0 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
2c8c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
2c8d0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
2c8e0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
2c8f0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
2c900 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
2c910 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
2c920 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
2c930 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2c940 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
2c950 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
2c960 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
2c970 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
2c980 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
2c990 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
2c9a0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
2c9b0 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
2c9c0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
2c9d0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
2c9e0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
2c9f0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
2ca00 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
2ca10 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
2ca20 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
2ca30 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
2ca40 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2ca50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
2ca60 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
2ca70 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
2ca80 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
2ca90 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
2caa0 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
2cab0 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
2cac0 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
2cad0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
2cae0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
2caf0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 30  uccess, return 0
2cb00 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
2cb10 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
2cb20 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2cb30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cb40 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49  unixCurrentTimeI
2cb50 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
2cb60 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74   *NotUsed, sqlit
2cb70 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
2cb80 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
2cb90 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
2cba0 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
2cbb0 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
2cbc0 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 20  64)8640000;.#if 
2cbd0 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f  defined(NO_GETTO
2cbe0 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20  D).  time_t t;. 
2cbf0 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69   time(&t);.  *pi
2cc00 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f  Now = ((sqlite3_
2cc10 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20  int64)t)*1000 + 
2cc20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66  unixEpoch;.#elif
2cc30 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
2cc40 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e  ruct timespec sN
2cc50 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74  ow;.  clock_gett
2cc60 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49  ime(CLOCK_REALTI
2cc70 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70  ME, &sNow);.  *p
2cc80 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
2cc90 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
2cca0 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
2ccb0 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65  ec + sNow.tv_nse
2ccc0 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65  c/1000000;.#else
2ccd0 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
2cce0 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d  l sNow;.  gettim
2ccf0 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29  eofday(&sNow, 0)
2cd00 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  ;.  *piNow = uni
2cd10 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
2cd20 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
2cd30 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
2cd40 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65  tv_usec/1000;.#e
2cd50 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
2cd60 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
2cd70 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2cd80 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ime ){.    *piNo
2cd90 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65  w = 1000*(sqlite
2cda0 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f  3_int64)sqlite3_
2cdb0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75  current_time + u
2cdc0 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65  nixEpoch;.  }.#e
2cdd0 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
2cde0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2cdf0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
2ce00 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2ce10 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2ce20 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2ce30 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2ce40 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
2ce50 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
2ce60 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
2ce70 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
2ce80 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
2ce90 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
2cea0 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
2ceb0 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
2cec0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
2ced0 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
2cee0 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
2cef0 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65  *NotUsed, double
2cf00 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69   *prNow){.  sqli
2cf10 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 55  te3_int64 i;.  U
2cf20 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2cf30 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78  NotUsed);.  unix
2cf40 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2cf50 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f  (0, &i);.  *prNo
2cf60 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
2cf70 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
2cf80 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20  ./*.** We added 
2cf90 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f  the xGetLastErro
2cfa0 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20  r() method with 
2cfb0 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66  the intention of
2cfc0 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65   providing.** be
2cfd0 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65  tter low-level e
2cfe0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68  rror messages wh
2cff0 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73  en operating-sys
2d000 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d  tem problems com
2d010 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53  e up.** during S
2d020 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e  QLite operation.
2d030 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f    But so far, no
2d040 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20 62  ne of that has b
2d050 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  een implemented.
2d060 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20  ** in the core. 
2d070 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   So this routine
2d080 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
2d090 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69  .  For now, it i
2d0a0 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c  s merely.** a pl
2d0b0 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73  ace-holder..*/.s
2d0c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
2d0d0 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
2d0e0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2d0f0 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63   int NotUsed2, c
2d100 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a  har *NotUsed3){.
2d110 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d120 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55  ER(NotUsed);.  U
2d130 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2d140 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55  NotUsed2);.  UNU
2d150 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2d160 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72  tUsed3);.  retur
2d170 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a  n 0;.}.../*.****
2d180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d190 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69  **** End of sqli
2d1a0 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
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 0a 2a 2a 2a 2a  ***********.****
2d1d0 2a 2a 2a 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 2f 0a 0a 2f 2a 2a  **********/../**
2d220 2a 2a 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 2a 2a 2a 2a  ****************
2d240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d250 2a 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 0a 2a 2a 2a  ************.***
2d270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d280 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72  ******* Begin Pr
2d290 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  oxy Locking ****
2d2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
2d2c0 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
2d2d0 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b   is a "uber-lock
2d2e0 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  ing-method" in t
2d2f0 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75  his sense:  It u
2d300 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72  ses the.** other
2d310 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
2d320 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f   on secondary lo
2d330 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79  ck files.  Proxy
2d340 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a   locking is a.**
2d350 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72   meta-layer over
2d360 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d   top of the prim
2d370 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  itive locking im
2d380 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e  plemented above.
2d390 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65    For.** this re
2d3a0 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
2d3b0 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
2d3c0 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  ts of proxy lock
2d3d0 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a  ing is deferred.
2d3e0 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e  ** until late in
2d3f0 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29   the file (here)
2d400 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68   after all of th
2d410 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68  e other I/O meth
2d420 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  ods have.** been
2d430 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68   defined - so th
2d440 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  at the primitive
2d450 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
2d460 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   are available.*
2d470 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f  * as services to
2d480 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69   help with the i
2d490 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2d4a0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
2d4b0 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  **.****.**.** Th
2d4c0 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
2d4d0 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c  g schemes in SQL
2d4e0 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e  ite use byte-ran
2d4f0 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a  ge locks on the.
2d500 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2d510 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73   to coordinate s
2d520 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  afe, concurrent 
2d530 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
2d540 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e  le readers.** an
2d550 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a  d writers [http:
2d560 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63  //sqlite.org/loc
2d570 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54  kingv3.html].  T
2d580 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63  he five file loc
2d590 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28  king.** states (
2d5a0 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e  UNLOCKED, PENDIN
2d5b0 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  G, SHARED, RESER
2d5c0 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20  VED, EXCLUSIVE) 
2d5d0 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  are implemented.
2d5e0 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64  ** as POSIX read
2d5f0 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f   & write locks o
2d600 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66  ver fixed set of
2d610 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20   locations (via 
2d620 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46  fsctl),.** on AF
2d630 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65  P and SMB only e
2d640 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61  xclusive byte-ra
2d650 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76  nge locks are av
2d660 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74  ailable via fsct
2d670 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28  l.** with _IOWR(
2d680 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
2d690 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
2d6a0 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73  ) to track the s
2d6b0 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a  ame 5 states..**
2d6c0 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46   To simulate a F
2d6d0 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68  _RDLCK on the sh
2d6e0 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41  ared range, on A
2d6f0 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65  FP a randomly se
2d700 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73  lected.** addres
2d710 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  s in the shared 
2d720 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
2d730 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  or a SHARED lock
2d740 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20  , the entire.** 
2d750 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
2d760 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43  taken for an EXC
2d770 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a  LUSIVE lock):.**
2d780 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47  .**      PENDING
2d790 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34  _BYTE        0x4
2d7a0 30 30 30 30 30 30 30 09 09 20 20 20 09 0a 2a 2a  0000000..   ..**
2d7b0 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42        RESERVED_B
2d7c0 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30  YTE       0x4000
2d7d0 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41  0001.**      SHA
2d7e0 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20  RED_RANGE       
2d7f0 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30   0x40000002 -> 0
2d800 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20  x40000200.**.** 
2d810 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20  This works well 
2d820 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
2d830 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68  e system, but sh
2d840 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30  ows a nearly 100
2d850 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e  x.** slowdown in
2d860 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63   read performanc
2d870 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65  e on AFP because
2d880 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20   the AFP client 
2d890 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20  disables.** the 
2d8a0 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20  read cache when 
2d8b0 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
2d8c0 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45   are present.  E
2d8d0 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64  nabling the read
2d8e0 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65  .** cache expose
2d8f0 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65  s a cache cohere
2d900 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74  ncy problem that
2d910 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61   is present on a
2d920 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f  ll OS X.** suppo
2d930 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c  rted network fil
2d940 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20  e systems.  NFS 
2d950 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73  and AFP both obs
2d960 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73  erve the.** clos
2d970 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74  e-to-open semant
2d980 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67  ics for ensuring
2d990 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
2d9a0 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e  .** [http://nfs.
2d9b0 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f  sourceforge.net/
2d9c0 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20  #faq_a8], which 
2d9d0 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69  does not effecti
2d9e0 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20  vely.** address 
2d9f0 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73  the requirements
2da00 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20   for concurrent 
2da10 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
2da20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72  by multiple.** r
2da30 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
2da40 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77  rs.** [http://ww
2da50 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c  w.nabble.com/SQL
2da60 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65  ite-on-NFS-cache
2da70 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36  -coherency-td156
2da80 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a  55701.html]..**.
2da90 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68  ** To address th
2daa0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e  e performance an
2dab0 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  d cache coherenc
2dac0 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20  y issues, proxy 
2dad0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  file locking.** 
2dae0 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20  changes the way 
2daf0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
2db00 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79  is controlled by
2db10 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73   limiting access
2db20 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20   to a.** single 
2db30 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61  host at a time a
2db40 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c  nd moving file l
2db50 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20  ocks off of the 
2db60 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
2db70 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78   and onto a prox
2db80 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  y file on the lo
2db90 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  cal file system.
2dba0 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e    .**.**.** Usin
2dbb0 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a  g proxy locks.**
2dbc0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
2dbd0 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a  --.**.** C APIs.
2dbe0 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  **.**  sqlite3_f
2dbf0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
2dc00 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53  dbname, SQLITE_S
2dc10 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
2dc20 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
2dc30 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78             <prox
2dc40 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f  y_path> | ":auto
2dc50 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33  :");.**  sqlite3
2dc60 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
2dc70 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45  , dbname, SQLITE
2dc80 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
2dc90 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68  LE, &<proxy_path
2dca0 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c  >);.**.**.** SQL
2dcb0 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20   pragmas.**.**  
2dcc0 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
2dcd0 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
2dce0 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c  e=<proxy_path> |
2dcf0 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47   :auto:.**  PRAG
2dd00 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
2dd10 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a  ck_proxy_file.**
2dd20 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22  .** Specifying "
2dd30 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68  :auto:" means th
2dd40 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61  at if there is a
2dd50 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68   conch file with
2dd60 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68   a matching.** h
2dd70 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68  ost ID in it, th
2dd80 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20  e proxy path in 
2dd90 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
2dda0 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68  ill be used, oth
2ddb0 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78  erwise.** a prox
2ddc0 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20  y path based on 
2ddd0 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70 20  the user's temp 
2dde0 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66  dir.** (via conf
2ddf0 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
2de00 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e  SER_TEMP_DIR,...
2de10 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  )) will be used 
2de20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61  and the.** actua
2de30 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d  l proxy file nam
2de40 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
2de50 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64  rom the name and
2de60 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20   path of the.** 
2de70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
2de80 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
2de90 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61 74  **       For dat
2dea0 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73 65  abase path "/Use
2deb0 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a  rs/me/foo.db" .*
2dec0 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b  *       The lock
2ded0 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c   path will be "<
2dee0 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c  tmpdir>/sqlitepl
2def0 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66  ocks/_Users_me_f
2df00 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a  oo.db:auto:").**
2df10 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20  .** Once a lock 
2df20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75  proxy is configu
2df30 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62 61  red for a databa
2df40 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69  se connection, i
2df50 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20  t can not.** be 
2df60 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72  removed, however
2df70 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74 63   it may be switc
2df80 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  hed to a differe
2df90 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76 69  nt proxy path vi
2dfa0 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41  a.** the above A
2dfb0 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  PIs (assuming th
2dfc0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20  e conch file is 
2dfd0 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62  not being held b
2dfe0 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e  y another.** con
2dff0 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65  nection or proce
2e000 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48  ss). .**.**.** H
2e010 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ow proxy locking
2e020 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   works.** ------
2e030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e040 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69  -.**.** Proxy fi
2e050 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65  le locking relie
2e060 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74  s primarily on t
2e070 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e  wo new supportin
2e080 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20  g files: .**.** 
2e090 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20    *  conch file 
2e0a0 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20  to limit access 
2e0b0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2e0c0 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65  file to a single
2e0d0 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74   host.**      at
2e0e0 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20   a time.**.**   
2e0f0 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f  *  proxy file to
2e100 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79 20   act as a proxy 
2e110 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72 79  for the advisory
2e120 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a   locks normally.
2e130 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e  **      taken on
2e140 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
2e150 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  .** The conch fi
2e160 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72  le - to use a pr
2e170 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65  oxy file, sqlite
2e180 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c   must first "hol
2e190 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20  d the conch".** 
2e1a0 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c  by taking an sql
2e1b0 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64  ite-style shared
2e1c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
2e1d0 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67  ch file, reading
2e1e0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
2e1f0 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74   and comparing t
2e200 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65  he host's unique
2e210 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62 65   host ID (see be
2e220 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a  low) and lock.**
2e230 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61 69   proxy path agai
2e240 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20 73  nst the values s
2e250 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e  tored in the con
2e260 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66  ch.  The conch f
2e270 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64  ile is.** stored
2e280 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
2e290 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64 61  ectory as the da
2e2a0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
2e2b0 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a  the file name.**
2e2c0 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61 66   is patterned af
2e2d0 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ter the database
2e2e0 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e   file name as ".
2e2f0 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63  <databasename>-c
2e300 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65  onch"..** If the
2e310 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73   conch file does
2e320 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69   not exist, or i
2e330 74 27 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  t's contents do 
2e340 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a  not match the.**
2e350 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20   host ID and/or 
2e360 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e  proxy path, then
2e370 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63   the lock is esc
2e380 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63  alated to an exc
2e390 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61  lusive.** lock a
2e3a0 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  nd the conch fil
2e3b0 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70  e contents is up
2e3c0 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68  dated with the h
2e3d0 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79  ost ID and proxy
2e3e0 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65  .** path and the
2e3f0 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61   lock is downgra
2e400 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20  ded to a shared 
2e410 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20  lock again.  If 
2e420 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20  the conch.** is 
2e430 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
2e440 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20  process (with a 
2e450 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68  shared lock), th
2e460 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
2e470 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e  .** will fail an
2e480 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  d SQLITE_BUSY is
2e490 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
2e4a0 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
2e4b0 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  - a single-byte 
2e4c0 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c  file used for al
2e4d0 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20  l advisory file 
2e4e0 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  locks.** normall
2e4f0 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64  y taken on the d
2e500 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20  atabase file.   
2e510 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20  This allows for 
2e520 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  safe sharing.** 
2e530 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2e540 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c  file for multipl
2e550 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  e readers and wr
2e560 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  iters on the sam
2e570 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63  e.** host (the c
2e580 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61  onch ensures tha
2e590 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74  t they all use t
2e5a0 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f  he same local lo
2e5b0 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20  ck file)..**.** 
2e5c0 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c  Requesting the l
2e5d0 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e  ock proxy does n
2e5e0 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  ot immediately t
2e5f0 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69  ake the conch, i
2e600 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b  t is.** only tak
2e610 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  en when the firs
2e620 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63  t request to loc
2e630 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
2e640 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68  is made.  .** Th
2e650 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73  is matches the s
2e660 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20  emantics of the 
2e670 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b  traditional lock
2e680 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68  ing behavior, wh
2e690 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61  ere.** opening a
2e6a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
2e6b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64   database file d
2e6c0 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c  oes not take a l
2e6d0 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68  ock on it..** Th
2e6e0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  e shared lock an
2e6f0 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64  d an open file d
2e700 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61  escriptor are ma
2e710 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a  intained until .
2e720 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ** the connectio
2e730 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
2e740 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a  e is closed. .**
2e750 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
2e760 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  le and the lock 
2e770 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64  file are never d
2e780 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f  eleted so they o
2e790 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  nly need.** to b
2e7a0 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69  e created the fi
2e7b0 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72  rst time they ar
2e7c0 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  e used..**.** Co
2e7d0 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
2e7e0 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ons.** ---------
2e7f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
2e800 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45  **  SQLITE_PREFE
2e810 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
2e820 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61  **.**       Data
2e830 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73  base files acces
2e840 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c  sed on non-local
2e850 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72   file systems ar
2e860 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d  e.**       autom
2e870 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75  atically configu
2e880 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  red for proxy lo
2e890 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65  cking, lock file
2e8a0 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e  s are.**       n
2e8b0 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
2e8c0 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ly using the sam
2e8d0 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20  e logic as.**   
2e8e0 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
2e8f0 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74  proxy_file=":aut
2e900 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53  o:".**    .**  S
2e910 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
2e920 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e  G.**.**       En
2e930 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e  ables the loggin
2e940 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61  g of error messa
2e950 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20  ges during host 
2e960 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  id file.**      
2e970 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63   retrieval and c
2e980 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c  reation.**.**  L
2e990 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a  OCKPROXYDIR.**.*
2e9a0 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65  *       Override
2e9b0 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69  s the default di
2e9c0 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72  rectory used for
2e9d0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
2e9e0 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  s that.**       
2e9f0 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61  are named automa
2ea00 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20  tically via the 
2ea10 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67  ":auto:" setting
2ea20 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44  .**.**  SQLITE_D
2ea30 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
2ea40 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a  PERMISSIONS.**.*
2ea50 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69  *       Permissi
2ea60 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ons to use when 
2ea70 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63  creating a direc
2ea80 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67  tory for storing
2ea90 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f   the.**       lo
2eaa0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20  ck proxy files, 
2eab0 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c  only used when L
2eac0 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e  OCKPROXYDIR is n
2ead0 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a  ot set..**    .*
2eae0 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74  *    .** As ment
2eaf0 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65  ioned above, whe
2eb00 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  n compiled with 
2eb10 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2eb20 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20  OXY_LOCKING,.** 
2eb30 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69  setting the envi
2eb40 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
2eb50 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
2eb60 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31  OXY_LOCKING to 1
2eb70 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70   will.** force p
2eb80 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
2eb90 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72  be used for ever
2eba0 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
2ebb0 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a  opened, and 0.**
2ebc0 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f   will force auto
2ebd0 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b  matic proxy lock
2ebe0 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ing to be disabl
2ebf0 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ed for all datab
2ec00 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78  ase.** files (ex
2ec10 70 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20  plicity calling 
2ec20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  the SQLITE_SET_L
2ec30 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61  OCKPROXYFILE pra
2ec40 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65  gma or.** sqlite
2ec50 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50  _file_control AP
2ec60 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65  I is not affecte
2ec70 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43  d by SQLITE_FORC
2ec80 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29  E_PROXY_LOCKING)
2ec90 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78  ..*/../*.** Prox
2eca0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  y locking is onl
2ecb0 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  y available on M
2ecc0 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65  acOSX .*/.#if de
2ecd0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2ece0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2ecf0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2ed00 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  ./*.** The proxy
2ed10 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68  LockingContext h
2ed20 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64 20  as the path and 
2ed30 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  file structures 
2ed40 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a  for the remote .
2ed50 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f  ** and local pro
2ed60 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a  xy files in it.*
2ed70 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
2ed80 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2ed90 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  text proxyLockin
2eda0 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
2edb0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2edc0 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c  text {.  unixFil
2edd0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20  e *conchFile;   
2ede0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f        /* Open co
2edf0 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nch file */.  ch
2ee00 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74  ar *conchFilePat
2ee10 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
2ee20 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20  me of the conch 
2ee30 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
2ee40 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20  le *lockProxy;  
2ee50 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
2ee60 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a  roxy lock file *
2ee70 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72  /.  char *lockPr
2ee80 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20 20 20  oxyPath;        
2ee90 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2eea0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
2eeb0 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74  */.  char *dbPat
2eec0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
2eed0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2eee0 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20   open file */.  
2eef0 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20  int conchHeld;  
2ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ef10 31 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  1 if the conch i
2ef20 73 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f  s held, -1 if lo
2ef30 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64  ckless */.  void
2ef40 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74   *oldLockingCont
2ef50 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  ext;     /* Orig
2ef60 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74  inal lockingcont
2ef70 65 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f  ext to restore o
2ef80 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c  n close */.  sql
2ef90 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2efa0 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f  const *pOldMetho
2efb0 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  d;     /* Origin
2efc0 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66  al I/O methods f
2efd0 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a  or close */.};..
2efe0 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  /* .** The proxy
2eff0 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
2f000 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
2f010 20 61 74 20 64 62 50 61 74 68 20 69 73 20 77 72   at dbPath is wr
2f020 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68  itten into lPath
2f030 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74  , .** which must
2f040 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c   point to valid,
2f050 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79   writable memory
2f060 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
2f070 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74  r a maxLen lengt
2f080 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20  h.** file path. 
2f090 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2f0a0 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28  roxyGetLockPath(
2f0b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
2f0c0 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c  th, char *lPath,
2f0d0 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b   size_t maxLen){
2f0e0 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e  .  int len;.  in
2f0f0 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69  t dbLen;.  int i
2f100 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52  ;..#ifdef LOCKPR
2f110 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73  OXYDIR.  len = s
2f120 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f  trlcpy(lPath, LO
2f130 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c  CKPROXYDIR, maxL
2f140 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64  en);.#else.# ifd
2f150 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53  ef _CS_DARWIN_US
2f160 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a  ER_TEMP_DIR.  {.
2f170 20 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72      if( !confstr
2f180 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52  (_CS_DARWIN_USER
2f190 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68  _TEMP_DIR, lPath
2f1a0 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20  , maxLen) ){.   
2f1b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54     OSTRACE(("GET
2f1c0 4c 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64  LOCKPATH  failed
2f1d0 20 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64   %s errno=%d pid
2f1e0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
2f1f0 20 20 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72         lPath, er
2f200 72 6e 6f 2c 20 67 65 74 70 69 64 28 29 29 29 3b  rno, getpid()));
2f210 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f220 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
2f230 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
2f240 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
2f250 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20  "sqliteplocks", 
2f260 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d  maxLen);    .  }
2f270 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20  .# else.  len = 
2f280 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22  strlcpy(lPath, "
2f290 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  /tmp/", maxLen);
2f2a0 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
2f2b0 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e  .  if( lPath[len
2f2c0 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  -1]!='/' ){.    
2f2d0 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50  len = strlcat(lP
2f2e0 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e  ath, "/", maxLen
2f2f0 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74  );.  }.  .  /* t
2f300 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20  ransform the db 
2f310 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65  path to a unique
2f320 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20   cache name */. 
2f330 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74   dbLen = (int)st
2f340 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20  rlen(dbPath);.  
2f350 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65  for( i=0; i<dbLe
2f360 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28  n && (i+len+7)<(
2f370 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29  int)maxLen; i++)
2f380 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 64  {.    char c = d
2f390 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50  bPath[i];.    lP
2f3a0 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d  ath[i+len] = (c=
2f3b0 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d  ='/')?'_':c;.  }
2f3c0 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d  .  lPath[i+len]=
2f3d0 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28  '\0';.  strlcat(
2f3e0 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c  lPath, ":auto:",
2f3f0 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52   maxLen);.  OSTR
2f400 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
2f410 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
2f420 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
2f430 20 6c 50 61 74 68 2c 20 67 65 74 70 69 64 28 29   lPath, getpid()
2f440 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
2f450 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20  ITE_OK;.}../* . 
2f460 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20 6c  ** Creates the l
2f470 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79  ock file and any
2f480 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f   missing directo
2f490 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68  ries in lockPath
2f4a0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
2f4b0 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50  proxyCreateLockP
2f4c0 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
2f4d0 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74  lockPath){.  int
2f4e0 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20   i, len;.  char 
2f4f0 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  buf[MAXPATHLEN];
2f500 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30  .  int start = 0
2f510 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f  ;.  .  assert(lo
2f520 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20  ckPath!=NULL);. 
2f530 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74   /* try to creat
2f540 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d  e all the interm
2f550 65 64 69 61 74 65 20 64 69 72 65 63 74 6f 72 69  ediate directori
2f560 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69  es */.  len = (i
2f570 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61  nt)strlen(lockPa
2f580 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20  th);.  buf[0] = 
2f590 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66  lockPath[0];.  f
2f5a0 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20  or( i=1; i<len; 
2f5b0 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  i++ ){.    if( l
2f5c0 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f  ockPath[i] == '/
2f5d0 27 20 26 26 20 28 69 20 2d 20 73 74 61 72 74 20  ' && (i - start 
2f5e0 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  > 0) ){.      /*
2f5f0 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c   only mkdir if l
2f600 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f  eaf dir != "." o
2f610 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f  r "/" or ".." */
2f620 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73 74 61  .      if( i-sta
2f630 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74  rt>2 || (i-start
2f640 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==1 && buf[start
2f650 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
2f660 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a  start] != '/') .
2f670 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73           || (i-s
2f680 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73  tart==2 && buf[s
2f690 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20  tart] != '.' && 
2f6a0 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20  buf[start+1] != 
2f6b0 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '.') ){.        
2f6c0 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20  buf[i]='\0';.   
2f6d0 20 20 20 20 20 69 66 28 20 6d 6b 64 69 72 28 62       if( mkdir(b
2f6e0 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  uf, SQLITE_DEFAU
2f6f0 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
2f700 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20  ISSIONS) ){.    
2f710 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72        int err=er
2f720 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rno;.          i
2f730 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 20 29  f( err!=EEXIST )
2f740 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f   {.            O
2f750 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c  STRACE(("CREATEL
2f760 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20  OCKPATH  FAILED 
2f770 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20  creating %s, ". 
2f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f790 20 20 20 20 22 27 25 73 27 20 70 72 6f 78 79 20      "'%s' proxy 
2f7a0 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
2f7b0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
2f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66               buf
2f7d0 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c  , strerror(err),
2f7e0 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69   lockPath, getpi
2f7f0 64 28 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  d()));.         
2f800 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20     return err;. 
2f810 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f820 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2f830 20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20     start=i+1;.  
2f840 20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d    }.    buf[i] =
2f850 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20   lockPath[i];.  
2f860 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 52  }.  OSTRACE(("CR
2f870 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72  EATELOCKPATH  pr
2f880 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
2f890 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b   pid=%d\n", lock
2f8a0 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
2f8b0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
2f8c0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2f8d0 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64 65 73  new VFS file des
2f8e0 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20  criptor (stored 
2f8f0 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
2f900 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
2f910 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f  e3_malloc) and o
2f920 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  pen the file nam
2f930 65 64 20 22 70 61 74 68 22 20 69 6e 20 74 68 65  ed "path" in the
2f940 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2f950 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2f960 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
2f970 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63  e not only for c
2f980 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  losing the file 
2f990 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75  descriptor.** bu
2f9a0 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69  t also for freei
2f9b0 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73  ng the memory as
2f9c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2f9d0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2f9e0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2f9f0 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
2fa00 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20  File(.    const 
2fa10 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
2fa20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74     /* path for t
2fa30 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20  he new unixFile 
2fa40 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  */.    unixFile 
2fa50 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20  **ppFile,       
2fa60 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61  /* unixFile crea
2fa70 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  ted and returned
2fa80 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69   by ref */.    i
2fa90 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20  nt islockfile   
2faa0 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f          /* if no
2fab0 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64  n zero missing d
2fac0 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61  irs will be crea
2fad0 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74  ted */.) {.  int
2fae0 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78   fd = -1;.  unix
2faf0 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  File *pNew;.  in
2fb00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2fb10 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
2fb20 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
2fb30 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f  REAT;.  sqlite3_
2fb40 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20  vfs dummyVfs;.  
2fb50 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a  int terrno = 0;.
2fb60 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
2fb70 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a  pUnused = NULL;.
2fb80 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74  .  /* 1. first t
2fb90 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ry to open/creat
2fba0 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
2fbb0 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  2. if that fails
2fbc0 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  , and this is a 
2fbd0 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63  lock file (not-c
2fbe0 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74  onch), try creat
2fbf0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  ing.  ** the par
2fc00 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20  ent directories 
2fc10 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61  and then try aga
2fc20 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74  in..  ** 3. if t
2fc30 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74  hat fails, try t
2fc40 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
2fc50 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f  read-only.  ** o
2fc60 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
2fc70 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69  BUSY (if lock fi
2fc80 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20  le) or CANTOPEN 
2fc90 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
2fca0 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65  le.  */.  pUnuse
2fcb0 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
2fcc0 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  Fd(path, openFla
2fcd0 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73  gs);.  if( pUnus
2fce0 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70  ed ){.    fd = p
2fcf0 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65  Unused->fd;.  }e
2fd00 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64  lse{.    pUnused
2fd10 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2fd20 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
2fd30 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55  d));.    if( !pU
2fd40 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72  nused ){.      r
2fd50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2fd60 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
2fd70 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2fd80 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
2fd90 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2fda0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2fdb0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2fdc0 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
2fdd0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
2fde0 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  fd<0 && errno==E
2fdf0 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66  NOENT && islockf
2fe00 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ile ){.      if(
2fe10 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
2fe20 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51  Path(path) == SQ
2fe30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fe40 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2fe50 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
2fe60 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
2fe70 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2fe80 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IONS);.      }. 
2fe90 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
2fea0 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46  d<0 ){.    openF
2feb0 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
2fec0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
2fed0 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
2fee0 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45  Flags, SQLITE_DE
2fef0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2ff00 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72  SSIONS);.    ter
2ff10 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
2ff20 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
2ff30 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c     if( islockfil
2ff40 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2ff50 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
2ff60 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20     }.    switch 
2ff70 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20  (terrno) {.     
2ff80 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20   case EACCES:.  
2ff90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ffa0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
2ffb0 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20  case EIO: .     
2ffc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ffd0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20  _IOERR_LOCK; /* 
2ffe0 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
2fff0 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20  s the conch */. 
30000 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
30010 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
30020 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
30030 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  T;.    }.  }.  .
30040 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69    pNew = (unixFi
30050 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  le *)sqlite3_mal
30060 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77  loc(sizeof(*pNew
30070 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  ));.  if( pNew==
30080 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  NULL ){.    rc =
30090 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
300a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61     goto end_crea
300b0 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20  te_proxy;.  }.  
300c0 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
300d0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
300e0 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46  );.  pNew->openF
300f0 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
30100 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
30110 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  yVfs, 0, sizeof(
30120 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75  dummyVfs));.  du
30130 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20  mmyVfs.pAppData 
30140 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  = (void*)&autolo
30150 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75  ckIoFinder;.  du
30160 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22  mmyVfs.zName = "
30170 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65  dummy";.  pUnuse
30180 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55  d->fd = fd;.  pU
30190 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f  nused->flags = o
301a0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  penFlags;.  pNew
301b0 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
301c0 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66  sed;.  .  rc = f
301d0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64  illInUnixFile(&d
301e0 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 30 2c 20  ummyVfs, fd, 0, 
301f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
30200 4e 65 77 2c 20 70 61 74 68 2c 20 30 2c 20 30 2c  New, path, 0, 0,
30210 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
30220 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30230 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a  *ppFile = pNew;.
30240 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30250 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72  E_OK;.  }.end_cr
30260 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a  eate_proxy:    .
30270 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
30280 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  New, fd, __LINE_
30290 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  _);.  sqlite3_fr
302a0 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69  ee(pNew);.  sqli
302b0 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64  te3_free(pUnused
302c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
302d0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
302e0 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74  _TEST./* simulat
302f0 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73  e multiple hosts
30300 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69   by creating uni
30310 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20  que hostid file 
30320 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c  paths */.int sql
30330 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
30340 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65  = 0;.#endif..#de
30350 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54 49  fine PROXY_HOSTI
30360 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20 63  DLEN    16  /* c
30370 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20 69  onch file host i
30380 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20  d length */../* 
30390 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66 69 6e  Not always defin
303a0 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ed in the header
303b0 73 20 61 73 20 69 74 20 6f 75 67 68 74 20 74 6f  s as it ought to
303c0 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e   be */.extern in
303d0 74 20 67 65 74 68 6f 73 74 75 75 69 64 28 75 75  t gethostuuid(uu
303e0 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20 73  id_t id, const s
303f0 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 2a  truct timespec *
30400 77 61 69 74 29 3b 0a 0a 2f 2a 20 67 65 74 20 74  wait);../* get t
30410 68 65 20 68 6f 73 74 20 49 44 20 76 69 61 20 67  he host ID via g
30420 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48  ethostuuid(), pH
30430 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74  ostID must point
30440 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44   to PROXY_HOSTID
30450 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66  LEN .** bytes of
30460 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79   writable memory
30470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30480 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75  proxyGetHostID(u
30490 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48  nsigned char *pH
304a0 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72  ostID, int *pErr
304b0 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50 52  or){.  assert(PR
304c0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d  OXY_HOSTIDLEN ==
304d0 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29 29   sizeof(uuid_t))
304e0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73 74  ;.  memset(pHost
304f0 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53  ID, 0, PROXY_HOS
30500 54 49 44 4c 45 4e 29 3b 0a 23 69 66 20 64 65 66  TIDLEN);.#if def
30510 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f  ined(__MAX_OS_X_
30520 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55  VERSION_MIN_REQU
30530 49 52 45 44 29 5c 0a 20 20 20 20 20 20 20 20 20  IRED)\.         
30540 20 20 20 20 20 20 26 26 20 5f 5f 4d 41 43 5f 4f        && __MAC_O
30550 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  S_X_VERSION_MIN_
30560 52 45 51 55 49 52 45 44 3c 31 30 35 30 0a 20 20  REQUIRED<1050.  
30570 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
30580 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  st struct timesp
30590 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c  ec timeout = {1,
305a0 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69   0}; /* 1 sec ti
305b0 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66 28  meout */.    if(
305c0 20 67 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f   gethostuuid(pHo
305d0 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20  stID, &timeout) 
305e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
305f0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
30600 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
30610 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
30620 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
30630 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30640 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
30650 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
30660 5f 50 41 52 41 4d 45 54 45 52 28 70 45 72 72 6f  _PARAMETER(pErro
30670 72 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  r);.#endif.#ifde
30680 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
30690 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
306a0 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
306b0 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
306c0 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
306d0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
306e0 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30  _hostid_num != 0
306f0 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30  ){.    pHostID[0
30700 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74  ] = (char)(pHost
30710 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73  ID[0] + (char)(s
30720 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
30730 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a  m & 0xFF));.  }.
30740 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75  #endif.  .  retu
30750 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
30760 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  ./* The conch fi
30770 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
30780 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20  header, host id 
30790 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
307a0 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  th. */.#define P
307b0 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
307c0 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20  N 2   /* 1-byte 
307d0 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20  header, 16-byte 
307e0 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f  host id, path */
307f0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
30800 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20  EADERLEN    1   
30810 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65  /* conch file he
30820 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23  ader length */.#
30830 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54  define PROXY_PAT
30840 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59  HINDEX    (PROXY
30850 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
30860 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66  _HOSTIDLEN).#def
30870 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  ine PROXY_MAXCON
30880 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45  CHLEN  (PROXY_HE
30890 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
308a0 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c  STIDLEN+MAXPATHL
308b0 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65  EN)../* .** Take
308c0 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20  s an open conch 
308d0 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65  file, copies the
308e0 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e   contents to a n
308f0 65 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e  ew path and then
30900 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61   moves .** it ba
30910 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63  ck.  The newly c
30920 72 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69  reated file's fi
30930 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
30940 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
30950 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73  .** conch file s
30960 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e  tructure and fin
30970 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61  ally the origina
30980 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73  l conch file des
30990 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63  criptor is .** c
309a0 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20  losed.  Returns 
309b0 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66  zero if successf
309c0 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ul..*/.static in
309d0 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  t proxyBreakConc
309e0 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
309f0 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
30a00 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79  HostID){.  proxy
30a10 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
30a20 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
30a30 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
30a40 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
30a50 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
30a60 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
30a70 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
30a80 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50   char tPath[MAXP
30a90 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20  ATHLEN];.  char 
30aa0 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  buf[PROXY_MAXCON
30ab0 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a  CHLEN];.  char *
30ac0 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f  cPath = pCtx->co
30ad0 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73  nchFilePath;.  s
30ae0 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20  ize_t readLen = 
30af0 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68  0;.  size_t path
30b00 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Len = 0;.  char 
30b10 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b  errmsg[64] = "";
30b20 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
30b30 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20    int rc = -1;. 
30b40 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
30b50 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20  R(myHostID);..  
30b60 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  /* create a new 
30b70 70 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20  path by replace 
30b80 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63  the trailing '-c
30b90 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65  onch' with '-bre
30ba0 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e  ak' */.  pathLen
30bb0 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 68   = strlcpy(tPath
30bc0 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48  , cPath, MAXPATH
30bd0 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68  LEN);.  if( path
30be0 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c  Len>MAXPATHLEN |
30bf0 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a  | pathLen<6 || .
30c00 20 20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74       (strlcpy(&t
30c10 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c  Path[pathLen-5],
30c20 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20   "break", 6) != 
30c30 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  5) ){.    sqlite
30c40 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
30c50 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67  f(errmsg),errmsg
30c60 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65  ,"path error (le
30c70 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68  n %d)",(int)path
30c80 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  Len);.    goto e
30c90 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
30ca0 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20  }.  /* read the 
30cb0 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f  conch content */
30cc0 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50  .  readLen = osP
30cd0 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  read(conchFile->
30ce0 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41  h, buf, PROXY_MA
30cf0 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
30d00 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f   if( readLen<PRO
30d10 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a  XY_PATHINDEX ){.
30d20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
30d30 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
30d40 73 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64  sg),errmsg,"read
30d50 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
30d60 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a  ,(int)readLen);.
30d70 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
30d80 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
30d90 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
30da0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62   the temporary b
30db0 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66  reak file */.  f
30dc0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
30dd0 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f  tPath, (O_RDWR|O
30de0 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 0a  _CREAT|O_EXCL),.
30df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e00 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
30e10 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
30e20 4e 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20  NS);.  if( fd<0 
30e30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
30e40 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
30e50 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
30e60 22 63 72 65 61 74 65 20 66 61 69 6c 65 64 20 28  "create failed (
30e70 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
30e80 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
30e90 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lock;.  }.  if( 
30ea0 6f 73 50 77 72 69 74 65 28 66 64 2c 20 62 75 66  osPwrite(fd, buf
30eb0 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d  , readLen, 0) !=
30ec0 20 28 73 73 69 7a 65 5f 74 29 72 65 61 64 4c 65   (ssize_t)readLe
30ed0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
30ee0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
30ef0 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67  (errmsg), errmsg
30f00 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65 64 20  , "write failed 
30f10 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
30f20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
30f30 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  klock;.  }.  if(
30f40 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63   rename(tPath, c
30f50 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c  Path) ){.    sql
30f60 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
30f70 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
30f80 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61  rmsg, "rename fa
30f90 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
30fa0 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
30fb0 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
30fc0 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69    rc = 0;.  fpri
30fd0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f  ntf(stderr, "bro
30fe0 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e  ke stale lock on
30ff0 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a   %s\n", cPath);.
31000 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
31010 46 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  File, conchFile-
31020 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
31030 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20   conchFile->h = 
31040 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d  fd;.  conchFile-
31050 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52  >openFlags = O_R
31060 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a  DWR | O_CREAT;..
31070 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20  end_breaklock:. 
31080 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
31090 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
310a0 20 20 6f 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68    osUnlink(tPath
310b0 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
310c0 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c  close(pFile, fd,
310d0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
310e0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  }.    fprintf(st
310f0 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f  derr, "failed to
31100 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63   break stale loc
31110 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20  k on %s, %s\n", 
31120 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a  cPath, errmsg);.
31130 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
31140 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20  .}../* Take the 
31150 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f  requested lock o
31160 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
31170 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61   and break a sta
31180 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a  le lock if the .
31190 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  ** host id match
311a0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
311b0 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  t proxyConchLock
311c0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
311d0 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49  , uuid_t myHostI
311e0 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29  D, int lockType)
311f0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
31200 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
31210 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
31220 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
31230 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
31240 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
31250 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
31260 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  chFile;.  int rc
31270 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
31280 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a  int nTries = 0;.
31290 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
312a0 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a  c conchModTime;.
312b0 20 20 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e    .  memset(&con
312c0 63 68 4d 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69  chModTime, 0, si
312d0 7a 65 6f 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d  zeof(conchModTim
312e0 65 29 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  e));.  do {.    
312f0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
31300 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
31310 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
31320 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
31330 65 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b  e);.    nTries +
31340 2b 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  +;.    if( rc==S
31350 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
31360 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f      /* If the lo
31370 63 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79 29  ck failed (busy)
31380 3a 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20 74  :.       * 1st t
31390 72 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20  ry: get the mod 
313a0 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63  time of the conc
313b0 68 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64  h, wait 0.5s and
313c0 20 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20   try again. .   
313d0 20 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66      * 2nd try: f
313e0 61 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74  ail if the mod t
313f0 69 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68  ime changed or h
31400 6f 73 74 20 69 64 20 69 73 20 64 69 66 66 65 72  ost id is differ
31410 65 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20  ent, wait .     
31420 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 31 30    *           10
31430 20 73 65 63 20 61 6e 64 20 74 72 79 20 61 67 61   sec and try aga
31440 69 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20  in.       * 3rd 
31450 74 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c  try: break the l
31460 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  ock unless the m
31470 6f 64 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e  od time has chan
31480 67 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ged..       */. 
31490 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
314a0 20 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20   buf;.      if( 
314b0 6f 73 46 73 74 61 74 28 63 6f 6e 63 68 46 69 6c  osFstat(conchFil
314c0 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20  e->h, &buf) ){. 
314d0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
314e0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
314f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
31500 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
31510 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
31520 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69   .      if( nTri
31530 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  es==1 ){.       
31540 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20   conchModTime = 
31550 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
31560 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  ;.        usleep
31570 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69  (500000); /* wai
31580 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72  t 0.5 sec and tr
31590 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e  y the lock again
315a0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  */.        conti
315b0 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a  nue;  .      }..
315c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54        assert( nT
315d0 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20  ries>1 );.      
315e0 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  if( conchModTime
315f0 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73  .tv_sec != buf.s
31600 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73  t_mtimespec.tv_s
31610 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ec || .         
31620 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
31630 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d  nsec != buf.st_m
31640 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63  timespec.tv_nsec
31650 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
31660 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
31670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
31680 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d       if( nTries=
31690 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20  =2 ){  .        
316a0 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f  char tBuf[PROXY_
316b0 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
316c0 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
316d0 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c  osPread(conchFil
316e0 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58  e->h, tBuf, PROX
316f0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30  Y_MAXCONCHLEN, 0
31700 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
31710 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en<0 ){.        
31720 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
31730 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
31740 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
31750 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
31760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31770 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f    if( len>PROXY_
31780 50 41 54 48 49 4e 44 45 58 20 26 26 20 74 42 75  PATHINDEX && tBu
31790 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58  f[0]==(char)PROX
317a0 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b  Y_CONCHVERSION){
317b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
317c0 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
317d0 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ck if the host i
317e0 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  d doesn't match 
317f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
31800 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66   0!=memcmp(&tBuf
31810 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
31820 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f  ], myHostID, PRO
31830 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b  XY_HOSTIDLEN) ){
31840 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
31850 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
31860 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31870 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31880 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
31890 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  reak the lock on
318a0 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61   short read or a
318b0 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63   version mismatc
318c0 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  h */.          r
318d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
318e0 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
318f0 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30 30       usleep(1000
31900 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31  0000); /* wait 1
31910 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  0 sec and try th
31920 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a  e lock again */.
31930 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
31940 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
31950 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20   .      assert( 
31960 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20  nTries==3 );.   
31970 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42     if( 0==proxyB
31980 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  reakConchLock(pF
31990 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29  ile, myHostID) )
319a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
319b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
319c0 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
319d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
319e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
319f0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
31a00 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
31a10 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
31a20 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ile, SHARED_LOCK
31a30 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  );          .   
31a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
31a50 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
31a60 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
31a70 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
31a80 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
31a90 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63  *)conchFile, loc
31aa0 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20  kType);.        
31ab0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
31ac0 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53    } while( rc==S
31ad0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 6e 54  QLITE_BUSY && nT
31ae0 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72  ries<3 );.  .  r
31af0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
31b00 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63 68 20  Takes the conch 
31b10 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68 61 72  by taking a shar
31b20 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64  ed lock and read
31b30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f   the contents co
31b40 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b  nch, if .** lock
31b50 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  Path is non-NULL
31b60 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  , the host ID an
31b70 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
31b80 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20 41 20   must match.  A 
31b90 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74  NULL .** lockPat
31ba0 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  h means that the
31bb0 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74 68 65   lockPath in the
31bc0 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c   conch file will
31bd0 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
31be0 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d 61 74  .** host IDs mat
31bf0 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63  ch, or a new loc
31c00 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 67  k path will be g
31c10 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61 74  enerated automat
31c20 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77  ically .** and w
31c30 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63 6f  ritten to the co
31c40 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nch file..*/.sta
31c50 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 61 6b  tic int proxyTak
31c60 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20  eConch(unixFile 
31c70 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79  *pFile){.  proxy
31c80 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
31c90 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
31ca0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
31cb0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
31cc0 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28 20 70  ext; .  .  if( p
31cd0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d  Ctx->conchHeld!=
31ce0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
31cf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
31d00 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  se{.    unixFile
31d10 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
31d20 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
31d30 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74     uuid_t myHost
31d40 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45 72 72  ID;.    int pErr
31d50 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  or = 0;.    char
31d60 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d   readBuf[PROXY_M
31d70 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
31d80 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d   char lockPath[M
31d90 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20  AXPATHLEN];.    
31da0 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61  char *tempLockPa
31db0 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  th = NULL;.    i
31dc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
31dd0 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72 65 61 74  K;.    int creat
31de0 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20  eConch = 0;.    
31df0 69 6e 74 20 68 6f 73 74 49 64 4d 61 74 63 68 20  int hostIdMatch 
31e00 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 61  = 0;.    int rea
31e10 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e  dLen = 0;.    in
31e20 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68  t tryOldLockPath
31e30 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f   = 0;.    int fo
31e40 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d  rceNewLockPath =
31e50 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53 54   0;.    .    OST
31e60 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48  RACE(("TAKECONCH
31e70 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
31e80 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %d\n", conchFile
31e90 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
31ea0 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f    (pCtx->lockPro
31eb0 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c  xyPath ? pCtx->l
31ec0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22  ockProxyPath : "
31ed0 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64  :auto:"), getpid
31ee0 28 29 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  ()));..    rc = 
31ef0 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 6d  proxyGetHostID(m
31f00 79 48 6f 73 74 49 44 2c 20 26 70 45 72 72 6f 72  yHostID, &pError
31f10 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
31f20 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
31f30 52 52 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  RR ){.      pFil
31f40 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70  e->lastErrno = p
31f50 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74  Error;.      got
31f60 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
31f70 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
31f80 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
31f90 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
31fa0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
31fb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31fc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
31fd0 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
31fe0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65  .    }.    /* re
31ff0 61 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ad the existing 
32000 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
32010 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b    readLen = seek
32020 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c  AndRead((unixFil
32030 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c  e*)conchFile, 0,
32040 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f   readBuf, PROXY_
32050 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20  MAXCONCHLEN);.  
32060 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20    if( readLen<0 
32070 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20  ){.      /* I/O 
32080 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f  error: lastErrno
32090 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52   set by seekAndR
320a0 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69  ead */.      pFi
320b0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
320c0 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45  conchFile->lastE
320d0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
320e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
320f0 41 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  AD;.      goto e
32100 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
32110 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 61 64    }else if( read
32120 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44  Len<=(PROXY_HEAD
32130 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
32140 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20  IDLEN) || .     
32150 20 20 20 20 20 20 20 20 72 65 61 64 42 75 66 5b          readBuf[
32160 30 5d 21 3d 28 63 68 61 72 29 50 52 4f 58 59 5f  0]!=(char)PROXY_
32170 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a  CONCHVERSION ){.
32180 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74        /* a short
32190 20 72 65 61 64 20 6f 72 20 76 65 72 73 69 6f 6e   read or version
321a0 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63 68   format mismatch
321b0 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
321c0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 0a  o create a new .
321d0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66        ** conch f
321e0 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ile. .      */. 
321f0 20 20 20 20 20 63 72 65 61 74 65 43 6f 6e 63 68       createConch
32200 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
32210 2f 2a 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  /* if the host i
32220 64 20 6d 61 74 63 68 65 73 20 61 6e 64 20 74 68  d matches and th
32230 65 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72 65  e lock path alre
32240 61 64 79 20 65 78 69 73 74 73 20 69 6e 20 74 68  ady exists in th
32250 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77  e conch.    ** w
32260 65 27 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  e'll try to use 
32270 74 68 65 20 70 61 74 68 20 74 68 65 72 65 2c 20  the path there, 
32280 69 66 20 77 65 20 63 61 6e 27 74 20 6f 70 65 6e  if we can't open
32290 20 74 68 61 74 20 70 61 74 68 2c 20 77 65 27 6c   that path, we'l
322a0 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74 72 79 20  l .    ** retry 
322b0 77 69 74 68 20 61 20 6e 65 77 20 61 75 74 6f 2d  with a new auto-
322c0 67 65 6e 65 72 61 74 65 64 20 70 61 74 68 20 0a  generated path .
322d0 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20      */.    do { 
322e0 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65  /* in case we ne
322f0 65 64 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20  ed to try again 
32300 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61  for an :auto: na
32310 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  med lock file */
32320 0a 0a 20 20 20 20 20 20 69 66 28 20 21 63 72 65  ..      if( !cre
32330 61 74 65 43 6f 6e 63 68 20 26 26 20 21 66 6f 72  ateConch && !for
32340 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b  ceNewLockPath ){
32350 0a 20 20 20 20 20 20 20 20 68 6f 73 74 49 64 4d  .        hostIdM
32360 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26  atch = !memcmp(&
32370 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 48 45  readBuf[PROXY_HE
32380 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74  ADERLEN], myHost
32390 49 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ID, .           
323a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323b0 20 20 20 20 20 20 20 50 52 4f 58 59 5f 48 4f 53         PROXY_HOS
323c0 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  TIDLEN);.       
323d0 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68   /* if the conch
323e0 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70 61 72   has data compar
323f0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a  e the contents *
32400 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
32410 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
32420 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
32430 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65  /* for auto-name
32440 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  d local lock fil
32450 65 2c 20 6a 75 73 74 20 63 68 65 63 6b 20 74 68  e, just check th
32460 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 77 65  e host ID and we
32470 27 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 2a  'll.           *
32480 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20  * use the local 
32490 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74  lock file path t
324a0 68 61 74 27 73 20 61 6c 72 65 61 64 79 20 69 6e  hat's already in
324b0 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
324c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
324d0 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 29  f( hostIdMatch )
324e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 69  {.            si
324f0 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 28  ze_t pathLen = (
32500 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f  readLen - PROXY_
32510 50 41 54 48 49 4e 44 45 58 29 3b 0a 20 20 20 20  PATHINDEX);.    
32520 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
32530 20 20 20 20 20 69 66 28 20 70 61 74 68 4c 65 6e       if( pathLen
32540 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a  >=MAXPATHLEN ){.
32550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
32560 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e  thLen=MAXPATHLEN
32570 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
32580 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
32590 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26  mcpy(lockPath, &
325a0 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41  readBuf[PROXY_PA
325b0 54 48 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65  THINDEX], pathLe
325c0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
325d0 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e  lockPath[pathLen
325e0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
325f0 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20     tempLockPath 
32600 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20  = lockPath;.    
32610 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f          tryOldLo
32620 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20  ckPath = 1;.    
32630 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74          /* creat
32640 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
32650 6c 6f 63 6b 20 70 61 74 68 20 69 66 20 74 68 65  lock path if the
32660 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20   conch is taken 
32670 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  */.            g
32680 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
32690 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
326a0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
326b0 20 68 6f 73 74 49 64 4d 61 74 63 68 0a 20 20 20   hostIdMatch.   
326c0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 21              && !
326d0 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f  strncmp(pCtx->lo
326e0 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 26 72 65  ckProxyPath, &re
326f0 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48  adBuf[PROXY_PATH
32700 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20 20 20 20  INDEX],.        
32710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32720 20 20 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58 59     readLen-PROXY
32730 5f 50 41 54 48 49 4e 44 45 58 29 0a 20 20 20 20  _PATHINDEX).    
32740 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
32750 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73 74 20 61   /* conch host a
32760 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20 6d 61 74  nd lock path mat
32770 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
32780 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
32790 63 68 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  ch; .        }. 
327a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
327b0 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f      /* if the co
327c0 6e 63 68 20 69 73 6e 27 74 20 77 72 69 74 61 62  nch isn't writab
327d0 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d  le and doesn't m
327e0 61 74 63 68 2c 20 77 65 20 63 61 6e 27 74 20 74  atch, we can't t
327f0 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ake it */.      
32800 69 66 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  if( (conchFile->
32810 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52  openFlags&O_RDWR
32820 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20  ) == 0 ){.      
32830 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
32840 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  SY;.        goto
32850 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
32860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
32870 20 20 20 20 20 2f 2a 20 65 69 74 68 65 72 20 74       /* either t
32880 68 65 20 63 6f 6e 63 68 20 64 69 64 6e 27 74 20  he conch didn't 
32890 6d 61 74 63 68 20 6f 72 20 77 65 20 6e 65 65 64  match or we need
328a0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
328b0 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 66   one */.      if
328c0 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
328d0 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
328e0 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61    proxyGetLockPa
328f0 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  th(pCtx->dbPath,
32900 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41   lockPath, MAXPA
32910 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  THLEN);.        
32920 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c  tempLockPath = l
32930 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20  ockPath;.       
32940 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70   /* create a cop
32950 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61  y of the lock pa
32960 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20 74 68 65  th _only_ if the
32970 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20   conch is taken 
32980 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
32990 20 0a 20 20 20 20 20 20 2f 2a 20 75 70 64 61 74   .      /* updat
329a0 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68 6f 73  e conch with hos
329b0 74 20 61 6e 64 20 70 61 74 68 20 28 74 68 69 73  t and path (this
329c0 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74   will fail if ot
329d0 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20  her process.    
329e0 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65    ** has a share
329f0 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c  d lock already),
32a00 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20   if the host id 
32a10 6d 61 74 63 68 65 73 2c 20 75 73 65 20 74 68 65  matches, use the
32a20 20 62 69 67 0a 20 20 20 20 20 20 2a 2a 20 73 74   big.      ** st
32a30 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ick..      */.  
32a40 20 20 20 20 66 75 74 69 6d 65 73 28 63 6f 6e 63      futimes(conc
32a50 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b  hFile->h, NULL);
32a60 0a 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49  .      if( hostI
32a70 64 4d 61 74 63 68 20 26 26 20 21 63 72 65 61 74  dMatch && !creat
32a80 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20  eConch ){.      
32a90 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 2d    if( conchFile-
32aa0 3e 70 49 6e 6f 64 65 20 26 26 20 63 6f 6e 63 68  >pInode && conch
32ab0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
32ac0 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 20  hared>1 ){.     
32ad0 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74       /* We are t
32ae0 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
32af0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
32b00 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
32b10 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
32b20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
32b30 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
32b40 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
32b50 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
32b60 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
32b70 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
32b80 7b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  {          .    
32b90 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
32ba0 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
32bb0 20 6d 79 48 6f 73 74 49 44 2c 20 45 58 43 4c 55   myHostID, EXCLU
32bc0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
32bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
32be0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
32bf0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
32c00 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
32c10 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
32c20 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  le, EXCLUSIVE_LO
32c30 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
32c40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
32c50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32c60 63 68 61 72 20 77 72 69 74 65 42 75 66 66 65 72  char writeBuffer
32c70 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
32c80 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  EN];.        int
32c90 20 77 72 69 74 65 53 69 7a 65 20 3d 20 30 3b 0a   writeSize = 0;.
32ca0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
32cb0 20 77 72 69 74 65 42 75 66 66 65 72 5b 30 5d 20   writeBuffer[0] 
32cc0 3d 20 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  = (char)PROXY_CO
32cd0 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20  NCHVERSION;.    
32ce0 20 20 20 20 6d 65 6d 63 70 79 28 26 77 72 69 74      memcpy(&writ
32cf0 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 48 45  eBuffer[PROXY_HE
32d00 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74  ADERLEN], myHost
32d10 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44  ID, PROXY_HOSTID
32d20 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  LEN);.        if
32d30 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ( pCtx->lockProx
32d40 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20  yPath!=NULL ){. 
32d50 20 20 20 20 20 20 20 20 20 73 74 72 6c 63 70 79           strlcpy
32d60 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  (&writeBuffer[PR
32d70 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20  OXY_PATHINDEX], 
32d80 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
32d90 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
32da0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
32db0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 63  .          strlc
32dc0 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
32dd0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
32de0 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 2c 20  , tempLockPath, 
32df0 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
32e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77       }.        w
32e10 72 69 74 65 53 69 7a 65 20 3d 20 50 52 4f 58 59  riteSize = PROXY
32e20 5f 50 41 54 48 49 4e 44 45 58 20 2b 20 73 74 72  _PATHINDEX + str
32e30 6c 65 6e 28 26 77 72 69 74 65 42 75 66 66 65 72  len(&writeBuffer
32e40 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
32e50 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  ]);.        robu
32e60 73 74 5f 66 74 72 75 6e 63 61 74 65 28 63 6f 6e  st_ftruncate(con
32e70 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74 65  chFile->h, write
32e80 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Size);.        r
32e90 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28 28 73  c = unixWrite((s
32ea0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f  qlite3_file *)co
32eb0 6e 63 68 46 69 6c 65 2c 20 77 72 69 74 65 42 75  nchFile, writeBu
32ec0 66 66 65 72 2c 20 77 72 69 74 65 53 69 7a 65 2c  ffer, writeSize,
32ed0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 73 79   0);.        fsy
32ee0 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29  nc(conchFile->h)
32ef0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;.        /* If 
32f00 77 65 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  we created a new
32f10 20 63 6f 6e 63 68 20 66 69 6c 65 20 28 6e 6f 74   conch file (not
32f20 20 6a 75 73 74 20 75 70 64 61 74 65 64 20 74 68   just updated th
32f30 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
32f40 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c  .         ** val
32f50 69 64 20 63 6f 6e 63 68 20 66 69 6c 65 29 2c 20  id conch file), 
32f60 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
32f70 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
32f80 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
32f90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32fa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32fb0 5f 4f 4b 20 26 26 20 63 72 65 61 74 65 43 6f 6e  _OK && createCon
32fc0 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
32fd0 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
32fe0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
32ff0 72 72 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69  rr = osFstat(pFi
33000 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  le->h, &buf);.  
33010 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 3d          if( err=
33020 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
33030 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20 3d    mode_t cmode =
33040 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53 5f   buf.st_mode&(S_
33050 49 52 55 53 52 7c 53 5f 49 57 55 53 52 20 7c 20  IRUSR|S_IWUSR | 
33060 53 5f 49 52 47 52 50 7c 53 5f 49 57 47 52 50 20  S_IRGRP|S_IWGRP 
33070 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
33080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33090 20 20 20 20 20 20 20 20 20 20 53 5f 49 52 4f 54            S_IROT
330a0 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20 20  H|S_IWOTH);.    
330b0 20 20 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74          /* try t
330c0 6f 20 6d 61 74 63 68 20 74 68 65 20 64 61 74 61  o match the data
330d0 62 61 73 65 20 66 69 6c 65 20 52 2f 57 20 70 65  base file R/W pe
330e0 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f 72  rmissions, ignor
330f0 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69 66  e failure */.#if
33100 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58  ndef SQLITE_PROX
33110 59 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20 20  Y_DEBUG.        
33120 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e      osFchmod(con
33130 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65  chFile->h, cmode
33140 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
33150 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
33160 20 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63         rc = osFc
33170 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  hmod(conchFile->
33180 68 2c 20 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20  h, cmode);.     
33190 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72         }while( r
331a0 63 3d 3d 28 2d 31 29 20 26 26 20 65 72 72 6e 6f  c==(-1) && errno
331b0 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20  ==EINTR );.     
331c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
331d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
331e0 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72    int code = err
331f0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  no;.            
33200 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
33210 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49  , "fchmod %o FAI
33220 4c 45 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e  LED with %d %s\n
33230 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
33240 20 20 20 20 20 20 20 20 20 63 6d 6f 64 65 2c 20           cmode, 
33250 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63  code, strerror(c
33260 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ode));.         
33270 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
33280 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
33290 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f  f(stderr, "fchmo
332a0 64 20 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22  d %o SUCCEDED\n"
332b0 2c 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20  ,cmode);.       
332c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
332d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
332e0 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65      int code = e
332f0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
33300 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
33310 2c 20 22 53 54 41 54 20 46 41 49 4c 45 44 5b 25  , "STAT FAILED[%
33320 64 5d 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22  d] with %d %s\n"
33330 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
33340 20 20 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65         err, code
33350 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29  , strerror(code)
33360 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
33370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
33380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
33390 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
333a0 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
333b0 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
333c0 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  le, SHARED_LOCK)
333d0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 65 6e 64  ;.      .    end
333e0 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20  _takeconch:.    
333f0 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e    OSTRACE(("TRAN
33400 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25  SPROXY: CLOSE  %
33410 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
33420 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
33430 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
33440 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b  le->openFlags ){
33450 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 64 3b  .        int fd;
33460 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
33470 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  le->h>=0 ){.    
33480 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
33490 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  se(pFile, pFile-
334a0 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
334b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
334c0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
334d0 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62          fd = rob
334e0 75 73 74 5f 6f 70 65 6e 28 70 43 74 78 2d 3e 64  ust_open(pCtx->d
334f0 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70  bPath, pFile->op
33500 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  enFlags,.       
33510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
33520 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
33530 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
33540 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
33550 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f  (("TRANSPROXY: O
33560 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29 29  PEN  %d\n", fd))
33570 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 64  ;.        if( fd
33580 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
33590 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a   pFile->h = fd;.
335a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
335b0 20 20 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49           rc=SQLI
335c0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
335d0 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ; /* SQLITE_BUSY
335e0 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  ? proxyTakeConch
335f0 20 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 20 20   called.        
33600 20 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e     during lockin
33610 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  g */.        }. 
33620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
33630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33640 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  & !pCtx->lockPro
33650 78 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  xy ){.        ch
33660 61 72 20 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c  ar *path = tempL
33670 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f  ockPath ? tempLo
33680 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c  ckPath : pCtx->l
33690 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
336a0 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
336b0 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70  CreateUnixFile(p
336c0 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b  ath, &pCtx->lock
336d0 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20 20 20 20  Proxy, 1);.     
336e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
336f0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
33700 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f  TE_NOMEM && tryO
33710 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20  ldLockPath ){.  
33720 20 20 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f          /* we co
33730 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20 74 68  uldn't create th
33740 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  e proxy lock fil
33750 65 20 77 69 74 68 20 74 68 65 20 6f 6c 64 20 6c  e with the old l
33760 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 20  ock file path.  
33770 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
33780 72 79 20 61 67 61 69 6e 20 76 69 61 20 61 75 74  ry again via aut
33790 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20 20 20 20  o-naming .      
337a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
337b0 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61    forceNewLockPa
337c0 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
337d0 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68    tryOldLockPath
337e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
337f0 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20  continue; /* go 
33800 62 61 63 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b  back to the do {
33810 7d 20 77 68 69 6c 65 20 73 74 61 72 74 20 70 6f  } while start po
33820 69 6e 74 2c 20 74 72 79 20 61 67 61 69 6e 20 2a  int, try again *
33830 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
33840 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
33850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33860 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
33870 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
33880 20 70 61 74 68 20 69 66 20 77 65 20 65 78 74 72   path if we extr
33890 61 63 74 65 64 20 74 68 65 20 76 61 6c 75 65 0a  acted the value.
338a0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d           ** from
338b0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
338c0 6f 72 20 74 68 65 20 70 61 74 68 20 77 61 73 20  or the path was 
338d0 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
338e0 20 73 74 61 63 6b 0a 20 20 20 20 20 20 20 20 20   stack.         
338f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  */.        if( t
33900 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  empLockPath ){. 
33910 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c           pCtx->l
33920 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
33930 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
33940 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b  , tempLockPath);
33950 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
33960 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
33970 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
33980 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
33990 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
339a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
339b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
339c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
339d0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e         pCtx->con
339e0 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20  chHeld = 1;.    
339f0 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66 28      .        if(
33a00 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
33a10 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
33a20 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
33a30 20 20 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69          afpLocki
33a40 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66 70 43 74  ngContext *afpCt
33a50 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70  x;.          afp
33a60 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  Ctx = (afpLockin
33a70 67 43 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 2d  gContext *)pCtx-
33a80 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b  >lockProxy->lock
33a90 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
33aa0 20 20 20 20 20 20 61 66 70 43 74 78 2d 3e 64 62        afpCtx->db
33ab0 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  Path = pCtx->loc
33ac0 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
33ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
33ae0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  se {.        con
33af0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
33b00 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
33b10 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
33b20 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  e, NO_LOCK);.   
33b30 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
33b40 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20  CE(("TAKECONCH  
33b50 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46  %d %s\n", conchF
33b60 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
33b70 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
33b80 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65  E_OK?"ok":"faile
33b90 64 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  d"));.      retu
33ba0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20 77 68 69  rn rc;.    } whi
33bb0 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61  le (1); /* in ca
33bc0 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  se we need to re
33bd0 74 72 79 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c  try the :auto: l
33be0 6f 63 6b 20 66 69 6c 65 20 2d 20 0a 20 20 20 20  ock file - .    
33bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
33c00 77 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  we should never 
33c10 67 65 74 20 68 65 72 65 20 65 78 63 65 70 74 20  get here except 
33c20 76 69 61 20 74 68 65 20 27 63 6f 6e 74 69 6e 75  via the 'continu
33c30 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a  e' call. */.  }.
33c40 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c  }../*.** If pFil
33c50 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  e holds a lock o
33c60 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  n a conch file, 
33c70 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61  then release tha
33c80 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t lock..*/.stati
33c90 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61  c int proxyRelea
33ca0 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65  seConch(unixFile
33cb0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
33cc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
33cd0 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f          /* Subro
33ce0 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64  utine return cod
33cf0 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  e */.  proxyLock
33d00 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
33d10 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e  ;  /* The lockin
33d20 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68  g context for th
33d30 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a  e proxy lock */.
33d40 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
33d50 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  hFile;        /*
33d60 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
33d70 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43  ch file */..  pC
33d80 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
33d90 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
33da0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
33db0 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d  t;.  conchFile =
33dc0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
33dd0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
33de0 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66  LEASECONCH  %d f
33df0 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
33e00 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
33e10 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
33e20 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
33e30 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
33e40 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
33e50 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  , .           ge
33e60 74 70 69 64 28 29 29 29 3b 0a 20 20 69 66 28 20  tpid()));.  if( 
33e70 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
33e80 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f  0 ){.    rc = co
33e90 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
33ea0 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
33eb0 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
33ec0 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  le, NO_LOCK);.  
33ed0 7d 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  }.  pCtx->conchH
33ee0 65 6c 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41  eld = 0;.  OSTRA
33ef0 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43  CE(("RELEASECONC
33f00 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e  H  %d %s\n", con
33f10 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
33f20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54        (rc==SQLIT
33f30 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
33f40 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74  ailed")));.  ret
33f50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
33f60 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
33f70 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  of a database fi
33f80 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20  le, compute the 
33f90 6e 61 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63  name of its conc
33fa0 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65  h file..** Store
33fb0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e   the conch filen
33fc0 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ame in memory ob
33fd0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
33fe0 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
33ff0 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74   Make *pConchPat
34000 68 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  h point to the n
34010 65 77 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  ew name.  Return
34020 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
34030 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49  ccess.** or SQLI
34040 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62  TE_NOMEM if unab
34050 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d  le to obtain mem
34060 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ory..**.** The c
34070 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
34080 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e  ible for ensurin
34090 67 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  g that the alloc
340a0 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73  ated memory.** s
340b0 70 61 63 65 20 69 73 20 65 76 65 6e 74 75 61 6c  pace is eventual
340c0 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
340d0 2a 70 43 6f 6e 63 68 50 61 74 68 20 69 73 20 73  *pConchPath is s
340e0 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20  et to NULL if a 
340f0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
34100 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
34110 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
34120 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61  oxyCreateConchPa
34130 74 68 6e 61 6d 65 28 63 68 61 72 20 2a 64 62 50  thname(char *dbP
34140 61 74 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e  ath, char **pCon
34150 63 68 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69  chPath){.  int i
34160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34170 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
34180 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
34190 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72  t len = (int)str
341a0 6c 65 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a 20  len(dbPath); /* 
341b0 4c 65 6e 67 74 68 20 6f 66 20 64 61 74 61 62 61  Length of databa
341c0 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62  se filename - db
341d0 50 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Path */.  char *
341e0 63 6f 6e 63 68 50 61 74 68 3b 20 20 20 20 20 20  conchPath;      
341f0 20 20 20 20 20 20 20 20 2f 2a 20 62 75 66 66 65          /* buffe
34200 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 63 6f  r in which to co
34210 6e 73 74 72 75 63 74 20 63 6f 6e 63 68 20 6e 61  nstruct conch na
34220 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  me */..  /* Allo
34230 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
34240 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d  he conch filenam
34250 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
34260 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a   the name to.  *
34270 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
34280 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
34290 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20  ase file. */  . 
342a0 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63   *pConchPath = c
342b0 6f 6e 63 68 50 61 74 68 20 3d 20 28 63 68 61 72  onchPath = (char
342c0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
342d0 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66  c(len + 8);.  if
342e0 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29  ( conchPath==0 )
342f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
34300 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
34310 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68 50 61 74   memcpy(conchPat
34320 68 2c 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31  h, dbPath, len+1
34330 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69  );.  .  /* now i
34340 6e 73 65 72 74 20 61 20 22 2e 22 20 62 65 66 6f  nsert a "." befo
34350 72 65 20 74 68 65 20 6c 61 73 74 20 2f 20 63 68  re the last / ch
34360 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72  aracter */.  for
34370 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d  ( i=(len-1); i>=
34380 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66  0; i-- ){.    if
34390 28 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d  ( conchPath[i]==
343a0 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  '/' ){.      i++
343b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
343c0 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68     }.  }.  conch
343d0 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77  Path[i]='.';.  w
343e0 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a  hile ( i<len ){.
343f0 20 20 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b      conchPath[i+
34400 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20  1]=dbPath[i];.  
34410 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
34420 20 61 70 70 65 6e 64 20 74 68 65 20 22 2d 63 6f   append the "-co
34430 6e 63 68 22 20 73 75 66 66 69 78 20 74 6f 20 74  nch" suffix to t
34440 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d  he file */.  mem
34450 63 70 79 28 26 63 6f 6e 63 68 50 61 74 68 5b 69  cpy(&conchPath[i
34460 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37  +1], "-conch", 7
34470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
34480 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61  t)strlen(conchPa
34490 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a  th) == len+7 );.
344a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
344b0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65  _OK;.}.../* Take
344c0 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67  s a fully config
344d0 75 72 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69  ured proxy locki
344e0 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69  ng-style unix fi
344f0 6c 65 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a  le and switches.
34500 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  ** the local loc
34510 6b 20 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a  k file path .*/.
34520 73 74 61 74 69 63 20 69 6e 74 20 73 77 69 74 63  static int switc
34530 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75  hLockProxyPath(u
34540 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
34550 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
34560 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ) {.  proxyLocki
34570 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
34580 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
34590 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
345a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
345b0 20 63 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d   char *oldPath =
345c0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
345d0 50 61 74 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Path;.  int rc =
345e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
345f0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
34600 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock!=NO_LOCK ){.
34610 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34620 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20  E_BUSY;.  }  .. 
34630 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   /* nothing to d
34640 6f 20 69 66 20 74 68 65 20 70 61 74 68 20 69 73  o if the path is
34650 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72   NULL, :auto: or
34660 20 6d 61 74 63 68 65 73 20 74 68 65 20 65 78 69   matches the exi
34670 73 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20  sting path */.  
34680 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74  if( !path || pat
34690 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73  h[0]=='\0' || !s
346a0 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75  trcmp(path, ":au
346b0 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c  to:") ||.    (ol
346c0 64 50 61 74 68 20 26 26 20 21 73 74 72 6e 63 6d  dPath && !strncm
346d0 70 28 6f 6c 64 50 61 74 68 2c 20 70 61 74 68 2c  p(oldPath, path,
346e0 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 20 29 7b   MAXPATHLEN)) ){
346f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
34700 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
34710 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f      unixFile *lo
34720 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e  ckProxy = pCtx->
34730 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70  lockProxy;.    p
34740 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e  Ctx->lockProxy=N
34750 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63  ULL;.    pCtx->c
34760 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20  onchHeld = 0;.  
34770 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21    if( lockProxy!
34780 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72  =NULL ){.      r
34790 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  c=lockProxy->pMe
347a0 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
347b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63  lite3_file *)loc
347c0 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69  kProxy);.      i
347d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
347e0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
347f0 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29  _free(lockProxy)
34800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
34810 74 65 33 5f 66 72 65 65 28 6f 6c 64 50 61 74 68  te3_free(oldPath
34820 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63  );.    pCtx->loc
34830 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c  kProxyPath = sql
34840 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
34850 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  path);.  }.  .  
34860 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34870 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20 61 20 66  .** pFile is a f
34880 69 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65  ile that has bee
34890 6e 20 6f 70 65 6e 65 64 20 62 79 20 61 20 70 72  n opened by a pr
348a0 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20  ior xOpen call. 
348b0 20 64 62 50 61 74 68 0a 2a 2a 20 69 73 20 61 20   dbPath.** is a 
348c0 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 61 74  string buffer at
348d0 20 6c 65 61 73 74 20 4d 41 58 50 41 54 48 4c 45   least MAXPATHLE
348e0 4e 2b 31 20 63 68 61 72 61 63 74 65 72 73 20 69  N+1 characters i
348f0 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n size..**.** Th
34900 69 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 64 20  is routine find 
34910 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  the filename ass
34920 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 46 69  ociated with pFi
34930 6c 65 20 61 6e 64 20 77 72 69 74 65 73 20 69 74  le and writes it
34940 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74 68 2e 0a  .** int dbPath..
34950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
34960 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55  oxyGetDbPathForU
34970 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
34980 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64   *pFile, char *d
34990 62 50 61 74 68 29 7b 0a 23 69 66 20 64 65 66 69  bPath){.#if defi
349a0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
349b0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
349c0 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  hod == &afpIoMet
349d0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61  hods ){.    /* a
349e0 66 70 20 73 74 79 6c 65 20 6b 65 65 70 73 20 61  fp style keeps a
349f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
34a00 65 20 64 62 20 70 61 74 68 20 69 6e 20 74 68 65  e db path in the
34a10 20 66 69 6c 65 50 61 74 68 20 66 69 65 6c 64 20   filePath field 
34a20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
34a30 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 61 73 73  truct */.    ass
34a40 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e  ert( (int)strlen
34a50 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  ((char*)pFile->l
34a60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d  ockingContext)<=
34a70 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20  MAXPATHLEN );.  
34a80 20 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68    strlcpy(dbPath
34a90 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  , ((afpLockingCo
34aa0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
34ab0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
34ac0 64 62 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  dbPath, MAXPATHL
34ad0 45 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65  EN);.  } else.#e
34ae0 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65  ndif.  if( pFile
34af0 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f  ->pMethod == &do
34b00 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29  tlockIoMethods )
34b10 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63  {.    /* dot loc
34b20 6b 20 73 74 79 6c 65 20 75 73 65 73 20 74 68 65  k style uses the
34b30 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
34b40 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f   to store the do
34b50 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69  t lock.    ** fi
34b60 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69  le path */.    i
34b70 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  nt len = strlen(
34b80 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
34b90 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d  ockingContext) -
34ba0 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f   strlen(DOTLOCK_
34bb0 53 55 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d  SUFFIX);.    mem
34bc0 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61  cpy(dbPath, (cha
34bd0 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
34be0 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b  ngContext, len +
34bf0 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
34c00 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73    /* all other s
34c10 74 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f  tyles use the lo
34c20 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f  cking context to
34c30 20 73 74 6f 72 65 20 74 68 65 20 64 62 20 66 69   store the db fi
34c40 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61  le path */.    a
34c50 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63  ssert( strlen((c
34c60 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
34c70 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58  ingContext)<=MAX
34c80 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73  PATHLEN );.    s
34c90 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28  trlcpy(dbPath, (
34ca0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
34cb0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41  ckingContext, MA
34cc0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20  XPATHLEN);.  }. 
34cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34ce0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65  K;.}../*.** Take
34cf0 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66 69 6c  s an already fil
34d00 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69 6c 65  led in unix file
34d10 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74 20 73   and alters it s
34d20 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69  o all file locki
34d30 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70  ng .** will be p
34d40 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
34d50 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b  local proxy lock
34d60 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c   file.  The foll
34d70 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20  owing fields.** 
34d80 61 72 65 20 70 72 65 73 65 72 76 65 64 20 69 6e  are preserved in
34d90 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
34da0 74 65 78 74 20 73 6f 20 74 68 61 74 20 74 68 65  text so that the
34db0 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  y can be restore
34dc0 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e  d and .** the un
34dd0 69 78 20 73 74 72 75 63 74 75 72 65 20 70 72 6f  ix structure pro
34de0 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20 75 70  perly cleaned up
34df0 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a   at close time:.
34e00 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  **  ->lockingCon
34e10 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68  text.**  ->pMeth
34e20 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  od.*/.static int
34e30 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
34e40 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
34e50 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63   *pFile, const c
34e60 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70  har *path) {.  p
34e70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
34e80 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68 61 72  xt *pCtx;.  char
34e90 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54 48 4c   dbPath[MAXPATHL
34ea0 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20  EN+1];       /* 
34eb0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
34ec0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
34ed0 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55  har *lockPath=NU
34ee0 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  LL;.  int rc = S
34ef0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69  QLITE_OK;.  .  i
34f00 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
34f10 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock!=NO_LOCK ){.
34f20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34f30 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72  E_BUSY;.  }.  pr
34f40 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55  oxyGetDbPathForU
34f50 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64  nixFile(pFile, d
34f60 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70  bPath);.  if( !p
34f70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d  ath || path[0]==
34f80 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28  '\0' || !strcmp(
34f90 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20  path, ":auto:") 
34fa0 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d  ){.    lockPath=
34fb0 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
34fc0 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61     lockPath=(cha
34fd0 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20  r *)path;.  }.  
34fe0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41  .  OSTRACE(("TRA
34ff0 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20  NSPROXY  %d for 
35000 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %s pid=%d\n", pF
35010 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
35020 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c     (lockPath ? l
35030 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  ockPath : ":auto
35040 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b  :"), getpid()));
35050 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74  ..  pCtx = sqlit
35060 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
35070 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66  f(*pCtx) );.  if
35080 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
35090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
350a0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
350b0 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65  et(pCtx, 0, size
350c0 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72  of(*pCtx));..  r
350d0 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 43  c = proxyCreateC
350e0 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62 50  onchPathname(dbP
350f0 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
35100 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69 66  hFilePath);.  if
35110 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35120 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ){.    rc = prox
35130 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
35140 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
35150 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
35160 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69  hFile, 0);.    i
35170 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
35180 4e 54 4f 50 45 4e 20 26 26 20 28 28 70 46 69 6c  NTOPEN && ((pFil
35190 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52  e->openFlags&O_R
351a0 44 57 52 29 20 3d 3d 20 30 29 20 29 7b 0a 20 20  DWR) == 0) ){.  
351b0 20 20 20 20 2f 2a 20 69 66 20 28 61 29 20 74 68      /* if (a) th
351c0 65 20 6f 70 65 6e 20 66 6c 61 67 73 20 61 72 65  e open flags are
351d0 20 6e 6f 74 20 4f 5f 52 44 57 52 2c 20 28 62 29   not O_RDWR, (b)
351e0 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74   the conch isn't
351f0 20 74 68 65 72 65 2c 20 61 6e 64 0a 20 20 20 20   there, and.    
35200 20 20 2a 2a 20 28 63 29 20 74 68 65 20 66 69 6c    ** (c) the fil
35210 65 20 73 79 73 74 65 6d 20 69 73 20 72 65 61 64  e system is read
35220 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62  -only, then enab
35230 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63  le no-locking ac
35240 63 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55  cess..      ** U
35250 67 68 2c 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e  gh, since O_RDON
35260 4c 59 3d 3d 30 78 30 30 30 30 20 77 65 20 74 65  LY==0x0000 we te
35270 73 74 20 66 6f 72 20 21 4f 5f 52 44 57 52 20 73  st for !O_RDWR s
35280 69 6e 63 65 20 75 6e 69 78 4f 70 65 6e 20 61 73  ince unixOpen as
35290 73 65 72 74 73 0a 20 20 20 20 20 20 2a 2a 20 74  serts.      ** t
352a0 68 61 74 20 6f 70 65 6e 46 6c 61 67 73 20 77 69  hat openFlags wi
352b0 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65  ll have only one
352c0 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20   of O_RDONLY or 
352d0 4f 5f 52 44 57 52 2e 0a 20 20 20 20 20 20 2a 2f  O_RDWR..      */
352e0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
352f0 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  atfs fsInfo;.   
35300 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 63     struct stat c
35310 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20 20 20 20 20  onchInfo;.      
35320 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d  int goLockless =
35330 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f   0;..      if( o
35340 73 53 74 61 74 28 70 43 74 78 2d 3e 63 6f 6e 63  sStat(pCtx->conc
35350 68 46 69 6c 65 50 61 74 68 2c 20 26 63 6f 6e 63  hFilePath, &conc
35360 68 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b  hInfo) == -1 ) {
35370 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72  .        int err
35380 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
35390 20 20 69 66 28 20 28 65 72 72 3d 3d 45 4e 4f 45    if( (err==ENOE
353a0 4e 54 29 20 26 26 20 28 73 74 61 74 66 73 28 64  NT) && (statfs(d
353b0 62 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  bPath, &fsInfo) 
353c0 21 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  != -1) ){.      
353d0 20 20 20 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d      goLockless =
353e0 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73   (fsInfo.f_flags
353f0 26 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20  &MNT_RDONLY) == 
35400 4d 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  MNT_RDONLY;.    
35410 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35420 20 20 20 20 69 66 28 20 67 6f 4c 6f 63 6b 6c 65      if( goLockle
35430 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ss ){.        pC
35440 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
35450 2d 31 3b 20 2f 2a 20 72 65 61 64 20 6f 6e 6c 79  -1; /* read only
35460 20 46 53 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f   FS/ lockless */
35470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
35480 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
35490 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 69  .    }.  }  .  i
354a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
354b0 20 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a   && lockPath ){.
354c0 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
354d0 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
354e0 33 44 62 53 74 72 44 75 70 28 30 2c 20 6c 6f 63  3DbStrDup(0, loc
354f0 6b 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 69  kPath);.  }..  i
35500 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35510 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 64 62   ){.    pCtx->db
35520 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62  Path = sqlite3Db
35530 53 74 72 44 75 70 28 30 2c 20 64 62 50 61 74 68  StrDup(0, dbPath
35540 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  );.    if( pCtx-
35550 3e 64 62 50 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b  >dbPath==NULL ){
35560 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
35570 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
35580 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
35590 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
355a0 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20  * all memory is 
355b0 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79  allocated, proxy
355c0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 61 6e  s are created an
355d0 64 20 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20  d assigned, .   
355e0 20 2a 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c   ** switch the l
355f0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61  ocking context a
35600 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20  nd pMethod then 
35610 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20  return..    */. 
35620 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b     pCtx->oldLock
35630 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69  ingContext = pFi
35640 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
35650 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  xt;.    pFile->l
35660 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
35670 70 43 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e  pCtx;.    pCtx->
35680 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69  pOldMethod = pFi
35690 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20  le->pMethod;.   
356a0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
356b0 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
356c0 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
356d0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  if( pCtx->conchF
356e0 69 6c 65 20 29 7b 20 0a 20 20 20 20 20 20 70 43  ile ){ .      pC
356f0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  tx->conchFile->p
35700 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
35710 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70  sqlite3_file *)p
35720 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b  Ctx->conchFile);
35730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
35740 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  ree(pCtx->conchF
35750 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
35760 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
35770 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
35780 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
35790 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f  e3_free(pCtx->co
357a0 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 20 0a 20  nchFilePath); . 
357b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
357c0 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54  pCtx);.  }.  OST
357d0 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58  RACE(("TRANSPROX
357e0 59 20 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69  Y  %d %s\n", pFi
357f0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
35800 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b    (rc==SQLITE_OK
35810 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
35820 64 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d")));.  return 
35830 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
35840 69 73 20 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c  is routine handl
35850 65 73 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  es sqlite3_file_
35860 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20  control() calls 
35870 74 68 61 74 20 61 72 65 20 73 70 65 63 69 66 69  that are specifi
35880 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f  c.** to proxy lo
35890 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
358a0 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f   int proxyFileCo
358b0 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
358c0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
358d0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
358e0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
358f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54   case SQLITE_GET
35900 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
35910 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
35920 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
35930 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69  ile*)id;.      i
35940 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
35950 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  d == &proxyIoMet
35960 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20  hods ){.        
35970 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35980 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
35990 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
359a0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
359b0 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20  Context;.       
359c0 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
359d0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
359e0 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  if( pCtx->lockPr
359f0 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
35a00 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61       *(const cha
35a10 72 20 2a 2a 29 70 41 72 67 20 3d 20 70 43 74 78  r **)pArg = pCtx
35a20 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
35a30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
35a40 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73            *(cons
35a50 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d  t char **)pArg =
35a60 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65   ":auto: (not he
35a70 6c 64 29 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ld)";.        }.
35a80 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
35a90 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63         *(const c
35aa0 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55  har **)pArg = NU
35ab0 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
35ac0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35ad0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
35ae0 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  se SQLITE_SET_LO
35af0 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
35b00 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
35b10 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
35b20 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  *)id;.      int 
35b30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35b40 20 20 20 20 20 20 69 6e 74 20 69 73 50 72 6f 78        int isProx
35b50 79 53 74 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d  yStyle = (pFile-
35b60 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f  >pMethod == &pro
35b70 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20  xyIoMethods);.  
35b80 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55      if( pArg==NU
35b90 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61  LL || (const cha
35ba0 72 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20  r *)pArg==0 ){. 
35bb0 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f         if( isPro
35bc0 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20  xyStyle ){.     
35bd0 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66       /* turn off
35be0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d   proxy locking -
35bf0 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 2a   not supported *
35c00 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
35c10 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a   SQLITE_ERROR /*
35c20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f  SQLITE_PROTOCOL?
35c30 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a   SQLITE_MISUSE?*
35c40 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  /;.        }else
35c50 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  {.          /* t
35c60 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f  urn off proxy lo
35c70 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64 79 20  cking - already 
35c80 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20  off - NOOP */.  
35c90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
35ca0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
35cb0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
35cc0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
35cd0 72 20 2a 70 72 6f 78 79 50 61 74 68 20 3d 20 28  r *proxyPath = (
35ce0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72  const char *)pAr
35cf0 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  g;.        if( i
35d00 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20  sProxyStyle ){. 
35d10 20 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f           proxyLo
35d20 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
35d30 74 78 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  tx = .          
35d40 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43    (proxyLockingC
35d50 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
35d60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
35d70 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 74           if( !st
35d80 72 63 6d 70 28 70 41 72 67 2c 20 22 3a 61 75 74  rcmp(pArg, ":aut
35d90 6f 3a 22 29 20 0a 20 20 20 20 20 20 20 20 20 20  o:") .          
35da0 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50   || (pCtx->lockP
35db0 72 6f 78 79 50 61 74 68 20 26 26 0a 20 20 20 20  roxyPath &&.    
35dc0 20 20 20 20 20 20 20 20 20 20 20 21 73 74 72 6e             !strn
35dd0 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  cmp(pCtx->lockPr
35de0 6f 78 79 50 61 74 68 2c 20 70 72 6f 78 79 50 61  oxyPath, proxyPa
35df0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29  th, MAXPATHLEN))
35e00 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
35e10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
35e20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
35e30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35e40 20 20 20 20 20 20 20 72 63 20 3d 20 73 77 69 74         rc = swit
35e50 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28  chLockProxyPath(
35e60 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68  pFile, proxyPath
35e70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
35e80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
35e90 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20          /* turn 
35ea0 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  on proxy file lo
35eb0 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  cking */.       
35ec0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61     rc = proxyTra
35ed0 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70  nsformUnixFile(p
35ee0 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29  File, proxyPath)
35ef0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35f00 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
35f10 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
35f20 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
35f30 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a  assert( 0 );  /*
35f40 20 54 68 65 20 63 61 6c 6c 20 61 73 73 75 72 65   The call assure
35f50 73 20 74 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69  s that only vali
35f60 64 20 6f 70 63 6f 64 65 73 20 61 72 65 20 73 65  d opcodes are se
35f70 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  nt */.    }.  }.
35f80 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
35f90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35fa0 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
35fb0 20 57 69 74 68 69 6e 20 74 68 69 73 20 64 69 76   Within this div
35fc0 69 73 69 6f 6e 20 28 74 68 65 20 70 72 6f 78 79  ision (the proxy
35fd0 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ing locking impl
35fe0 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68 65 20  ementation) the 
35ff0 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20 61 62  procedures.** ab
36000 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20 61  ove this point a
36010 72 65 20 61 6c 6c 20 75 74 69 6c 69 74 69 65 73  re all utilities
36020 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61  .  The lock-rela
36030 74 65 64 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  ted methods of t
36040 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b  he.** proxy-lock
36050 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  ing sqlite3_io_m
36060 65 74 68 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c  ethod object fol
36070 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  low..*/.../*.** 
36080 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
36090 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
360a0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
360b0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
360c0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
360d0 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
360e0 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
360f0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
36100 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
36110 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
36120 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
36130 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
36140 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
36150 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
36160 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
36170 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
36180 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
36190 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
361a0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
361b0 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  nt proxyCheckRes
361c0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
361d0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
361e0 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e  *pResOut) {.  un
361f0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
36200 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
36210 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54   int rc = proxyT
36220 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
36230 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
36240 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78  E_OK ){.    prox
36250 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
36260 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
36270 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
36280 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
36290 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  text;.    if( pC
362a0 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20  tx->conchHeld>0 
362b0 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c  ){.      unixFil
362c0 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d  e *proxy = pCtx-
362d0 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
362e0 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e    return proxy->
362f0 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52  pMethod->xCheckR
36300 65 73 65 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c  eservedLock((sql
36310 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79  ite3_file*)proxy
36320 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 20 20  , pResOut);.    
36330 7d 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48  }else{ /* conchH
36340 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c  eld < 0 is lockl
36350 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 70 52 65  ess */.      pRe
36360 73 4f 75 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20  sOut=0;.    }.  
36370 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
36380 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
36390 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
363a0 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
363b0 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
363c0 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
363d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
363e0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
363f0 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
36400 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
36410 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
36420 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
36430 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
36440 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
36450 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
36460 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
36470 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
36480 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
36490 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
364a0 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
364b0 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
364c0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
364d0 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
364e0 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
364f0 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
36500 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
36510 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
36520 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
36530 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
36540 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
36550 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
36560 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
36570 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
36580 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
36590 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
365a0 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
365b0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
365c0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
365d0 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
365e0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
365f0 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
36600 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
36610 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
36620 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
36630 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
36640 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
36650 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
36660 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
36670 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
36680 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
36690 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
366a0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
366b0 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74   proxyLock(sqlit
366c0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
366d0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
366e0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
366f0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
36700 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
36710 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
36720 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
36730 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
36740 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
36750 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
36760 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
36770 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
36780 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ontext;.    if( 
36790 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
367a0 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  0 ){.      unixF
367b0 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
367c0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
367d0 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e      rc = proxy->
367e0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
367f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
36800 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b  oxy, eFileLock);
36810 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
36820 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d  ileLock = proxy-
36830 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20  >eFileLock;.    
36840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
36850 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73  conchHeld < 0 is
36860 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
36870 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
36880 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  rc;.}.../*.** Lo
36890 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
368a0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
368b0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
368c0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
368d0 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
368e0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
368f0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
36900 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
36910 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
36920 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
36930 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
36940 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
36950 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
36960 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
36970 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
36980 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
36990 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
369a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
369b0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
369c0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
369d0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
369e0 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  id;.  int rc = p
369f0 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46  roxyTakeConch(pF
36a00 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ile);.  if( rc==
36a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36a20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
36a30 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
36a40 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
36a50 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
36a60 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69  ngContext;.    i
36a70 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
36a80 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e  ld>0 ){.      un
36a90 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20  ixFile *proxy = 
36aa0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
36ab0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78  .      rc = prox
36ac0 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  y->pMethod->xUnl
36ad0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
36ae0 65 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c  e*)proxy, eFileL
36af0 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  ock);.      pFil
36b00 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70  e->eFileLock = p
36b10 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b  roxy->eFileLock;
36b20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36b30 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c    /* conchHeld <
36b40 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a   0 is lockless *
36b50 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  /.    }.  }.  re
36b60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
36b70 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 74  * Close a file t
36b80 68 61 74 20 75 73 65 73 20 70 72 6f 78 79 20 6c  hat uses proxy l
36b90 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
36ba0 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73  int proxyClose(s
36bb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
36bc0 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
36bd0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
36be0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
36bf0 69 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63  id;.    proxyLoc
36c00 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
36c10 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
36c20 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
36c30 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
36c40 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  ;.    unixFile *
36c50 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78  lockProxy = pCtx
36c60 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
36c70 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
36c80 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
36c90 63 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20  chFile;.    int 
36ca0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
36cb0 20 20 20 20 0a 20 20 20 20 69 66 28 20 6c 6f 63      .    if( loc
36cc0 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  kProxy ){.      
36cd0 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e  rc = lockProxy->
36ce0 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
36cf0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
36d00 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f  lockProxy, NO_LO
36d10 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
36d20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
36d30 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72       rc = lockPr
36d40 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  oxy->pMethod->xC
36d50 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
36d60 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  le*)lockProxy);.
36d70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
36d80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36d90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63  sqlite3_free(loc
36da0 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 70  kProxy);.      p
36db0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d  Ctx->lockProxy =
36dc0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
36dd0 28 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20  ( conchFile ){. 
36de0 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63       if( pCtx->c
36df0 6f 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20 20 20  onchHeld ){.    
36e00 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 52 65      rc = proxyRe
36e10 6c 65 61 73 65 43 6f 6e 63 68 28 70 46 69 6c 65  leaseConch(pFile
36e20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
36e30 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
36e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
36e50 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
36e60 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
36e70 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
36e80 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  hFile);.      if
36e90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
36ea0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
36eb0 66 72 65 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b  free(conchFile);
36ec0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
36ed0 65 33 44 62 46 72 65 65 28 30 2c 20 70 43 74 78  e3DbFree(0, pCtx
36ee0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29  ->lockProxyPath)
36ef0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
36f00 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  ee(pCtx->conchFi
36f10 6c 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  lePath);.    sql
36f20 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 43  ite3DbFree(0, pC
36f30 74 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 20  tx->dbPath);.   
36f40 20 2f 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20   /* restore the 
36f50 6f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  original locking
36f60 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65   context and pMe
36f70 74 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65 20  thod then close 
36f80 69 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  it */.    pFile-
36f90 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
36fa0 3d 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69  = pCtx->oldLocki
36fb0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70  ngContext;.    p
36fc0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
36fd0 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64  pCtx->pOldMethod
36fe0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
36ff0 65 65 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65  ee(pCtx);.    re
37000 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74  turn pFile->pMet
37010 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b  hod->xClose(id);
37020 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
37030 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65  LITE_OK;.}....#e
37040 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
37050 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
37060 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
37070 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
37080 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
37090 6b 69 6e 67 20 73 74 79 6c 65 20 69 73 20 69 6e  king style is in
370a0 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77  tended for use w
370b0 69 74 68 20 41 46 50 20 66 69 6c 65 73 79 73 74  ith AFP filesyst
370c0 65 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63  ems..** And sinc
370d0 65 20 41 46 50 20 69 73 20 6f 6e 6c 79 20 73 75  e AFP is only su
370e0 70 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53  pported on MacOS
370f0 58 2c 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  X, the proxy loc
37100 6b 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20  king is also.** 
37110 72 65 73 74 72 69 63 74 65 64 20 74 6f 20 4d 61  restricted to Ma
37120 63 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a  cOSX..** .**.***
37130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37140 20 45 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 78   End of the prox
37150 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
37160 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
37170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
37180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
371d0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
371e0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
371f0 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
37200 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
37210 65 20 72 65 67 69 73 74 65 72 73 20 61 6c 6c 20  e registers all 
37220 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
37230 6f 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b  ons for unix-lik
37240 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73  e operating.** s
37250 79 73 74 65 6d 73 2e 20 20 54 68 69 73 20 72 6f  ystems.  This ro
37260 75 74 69 6e 65 2c 20 61 6e 64 20 74 68 65 20 73  utine, and the s
37270 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20  qlite3_os_end() 
37280 72 6f 75 74 69 6e 65 20 74 68 61 74 20 66 6f 6c  routine that fol
37290 6c 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  lows,.** should 
372a0 62 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74  be the only rout
372b0 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ines in this fil
372c0 65 20 74 68 61 74 20 61 72 65 20 76 69 73 69 62  e that are visib
372d0 6c 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a  le from other.**
372e0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   files..**.** Th
372f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
37300 6c 6c 65 64 20 6f 6e 63 65 20 64 75 72 69 6e 67  lled once during
37310 20 53 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69   SQLite initiali
37320 7a 61 74 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a  zation and by a.
37330 2a 2a 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64  ** single thread
37340 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c  .  The memory al
37350 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74  location and mut
37360 65 78 20 73 75 62 73 79 73 74 65 6d 73 20 68 61  ex subsystems ha
37370 76 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73  ve not.** necess
37380 61 72 69 6c 79 20 62 65 65 6e 20 69 6e 69 74 69  arily been initi
37390 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
373a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
373b0 65 64 2c 20 61 6e 64 20 73 6f 20 74 68 65 79 0a  ed, and so they.
373c0 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ** should not be
373d0 20 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71   used..*/.int sq
373e0 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f  lite3_os_init(vo
373f0 69 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a  id){ .  /* .  **
37400 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
37410 61 63 72 6f 20 64 65 66 69 6e 65 73 20 61 6e 20  acro defines an 
37420 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20  initializer for 
37430 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  an sqlite3_vfs o
37440 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20  bject..  ** The 
37450 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
37460 69 73 20 4e 41 4d 45 2e 20 20 54 68 65 20 70 41  is NAME.  The pA
37470 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e  ppData is a poin
37480 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ter to a pointer
37490 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 22 66 69  .  ** to the "fi
374a0 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20  nder" function. 
374b0 20 28 70 41 70 70 44 61 74 61 20 69 73 20 61 20   (pAppData is a 
374c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69  pointer to a poi
374d0 6e 74 65 72 20 62 65 63 61 75 73 65 0a 20 20 2a  nter because.  *
374e0 2a 20 73 69 6c 6c 79 20 43 39 30 20 72 75 6c 65  * silly C90 rule
374f0 73 20 70 72 6f 68 69 62 69 74 20 61 20 76 6f 69  s prohibit a voi
37500 64 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 61  d* from being ca
37510 73 74 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  st to a function
37520 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e   pointer.  ** an
37530 64 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  d so we have to 
37540 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  go through the i
37550 6e 74 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e  ntermediate poin
37560 74 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  ter to avoid pro
37570 62 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20  blems.  ** when 
37580 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d  compiling with -
37590 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20  pedantic-errors 
375a0 6f 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20  on GCC.).  **.  
375b0 2a 2a 20 54 68 65 20 46 49 4e 44 45 52 20 70 61  ** The FINDER pa
375c0 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20  rameter to this 
375d0 6d 61 63 72 6f 20 69 73 20 74 68 65 20 6e 61 6d  macro is the nam
375e0 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  e of the pointer
375f0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e   to the.  ** fin
37600 64 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54  der-function.  T
37610 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  he finder-functi
37620 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
37630 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  nter to the.  **
37640 20 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f   sqlite_io_metho
37650 64 73 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ds object that i
37660 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 64 65  mplements the de
37670 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20  sired locking.  
37680 2a 2a 20 62 65 68 61 76 69 6f 72 73 2e 20 20 53  ** behaviors.  S
37690 65 65 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  ee the division 
376a0 61 62 6f 76 65 20 74 68 61 74 20 63 6f 6e 74 61  above that conta
376b0 69 6e 73 20 74 68 65 20 49 4f 4d 45 54 48 4f 44  ins the IOMETHOD
376c0 53 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72  S.  ** macro for
376d0 20 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d   addition inform
376e0 61 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d  ation on finder-
376f0 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a  functions..  **.
37700 20 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72    ** Most finder
37710 73 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  s simply return 
37720 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
37730 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ixed sqlite3_io_
37740 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a  methods.  ** obj
37750 65 63 74 2e 20 20 42 75 74 20 74 68 65 20 22 61  ect.  But the "a
37760 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 22  utolockIoFinder"
37770 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
37780 63 4f 53 58 20 64 6f 65 73 20 61 20 6c 69 74 74  cOSX does a litt
37790 6c 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61  le.  ** more tha
377a0 6e 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b 73  n that; it looks
377b0 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
377c0 65 6d 20 74 79 70 65 20 74 68 61 74 20 68 6f 73  em type that hos
377d0 74 73 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74  ts the .  ** dat
377e0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
377f0 72 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 61  ries to choose a
37800 6e 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  n locking method
37810 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
37820 0a 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 73  .  ** that files
37830 79 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f  ystem time..  */
37840 0a 20 20 23 64 65 66 69 6e 65 20 55 4e 49 58 56  .  #define UNIXV
37850 46 53 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44  FS(VFSNAME, FIND
37860 45 52 29 20 7b 20 20 20 20 20 20 20 20 20 20 20  ER) {           
37870 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37880 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20     3,           
37890 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
378a0 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  sion */         
378b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
378c0 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
378d0 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69  ),     /* szOsFi
378e0 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  le */           
378f0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 4d           \.    M
37900 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20  AX_PATHNAME,    
37910 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61       /* mxPathna
37920 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
37930 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20         \.    0, 
37940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37950 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 20     /* pNext */  
37960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37970 20 20 20 20 20 5c 0a 20 20 20 20 56 46 53 4e 41       \.    VFSNA
37980 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ME,             
37990 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20 20   /* zName */    
379a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379b0 20 20 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a 29     \.    (void*)
379c0 26 46 49 4e 44 45 52 2c 20 20 20 20 20 20 20 2f  &FINDER,       /
379d0 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 20 20 20  * pAppData */   
379e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379f0 20 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c   \.    unixOpen,
37a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37a10 78 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20  xOpen */        
37a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37a30 0a 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c  .    unixDelete,
37a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
37a50 65 6c 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20  elete */        
37a60 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37a70 20 20 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20     unixAccess,  
37a80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
37a90 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ess */          
37aa0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37ab0 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
37ac0 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
37ad0 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20  athname */      
37ae0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
37af0 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  nixDlOpen,      
37b00 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
37b10 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
37b20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37b30 78 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  xDlError,       
37b40 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
37b50 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37b60 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
37b70 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
37b80 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20 20   /* xDlSym */   
37b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ba0 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 43     \.    unixDlC
37bb0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
37bc0 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20 20  * xDlClose */   
37bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37be0 20 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e 64 6f   \.    unixRando
37bf0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
37c00 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20 20  xRandomness */  
37c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37c20 0a 20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c 20  .    unixSleep, 
37c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
37c40 6c 65 65 70 20 2a 2f 20 20 20 20 20 20 20 20 20  leep */         
37c50 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37c60 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69     unixCurrentTi
37c70 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
37c80 72 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20 20  rentTime */     
37c90 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37ca0 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f   unixGetLastErro
37cb0 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
37cc0 73 74 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  stError */      
37cd0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
37ce0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
37cf0 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74  t64, /* xCurrent
37d00 54 69 6d 65 49 6e 74 36 34 20 2a 2f 20 20 20 20  TimeInt64 */    
37d10 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37d20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  xSetSystemCall, 
37d30 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
37d40 43 61 6c 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  Call */         
37d50 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47       \.    unixG
37d60 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
37d70 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
37d80 6c 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ll */           
37d90 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 4e 65 78     \.    unixNex
37da0 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f  tSystemCall,   /
37db0 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
37dc0 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  l */            
37dd0 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   \.  }..  /*.  *
37de0 2a 20 41 6c 6c 20 64 65 66 61 75 6c 74 20 56 46  * All default VF
37df0 53 65 73 20 66 6f 72 20 75 6e 69 78 20 61 72 65  Ses for unix are
37e00 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
37e10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
37e20 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  y..  **.  ** Not
37e30 65 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  e that the sqlit
37e40 65 33 5f 76 66 73 2e 70 4e 65 78 74 20 66 69 65  e3_vfs.pNext fie
37e50 6c 64 20 6f 66 20 74 68 65 20 56 46 53 20 6f 62  ld of the VFS ob
37e60 6a 65 63 74 20 69 73 20 6d 6f 64 69 66 69 65 64  ject is modified
37e70 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 53 51 4c  .  ** by the SQL
37e80 69 74 65 20 63 6f 72 65 20 77 68 65 6e 20 74 68  ite core when th
37e90 65 20 56 46 53 20 69 73 20 72 65 67 69 73 74 65  e VFS is registe
37ea0 72 65 64 2e 20 20 53 6f 20 74 68 65 20 66 6f 6c  red.  So the fol
37eb0 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72 61  lowing.  ** arra
37ec0 79 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73  y cannot be cons
37ed0 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63  t..  */.  static
37ee0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66   sqlite3_vfs aVf
37ef0 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c 49  s[] = {.#if SQLI
37f00 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
37f10 47 5f 53 54 59 4c 45 20 26 26 20 28 4f 53 5f 56  G_STYLE && (OS_V
37f20 58 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69 6e 65  XWORKS || define
37f30 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20  d(__APPLE__)).  
37f40 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
37f50 2c 20 20 20 20 20 20 20 20 20 20 61 75 74 6f 6c  ,          autol
37f60 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  ockIoFinder ),.#
37f70 65 6c 73 65 0a 20 20 20 20 55 4e 49 58 56 46 53  else.    UNIXVFS
37f80 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20  ("unix",        
37f90 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20    posixIoFinder 
37fa0 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 55 4e  ),.#endif.    UN
37fb0 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e 65  IXVFS("unix-none
37fc0 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46  ",     nolockIoF
37fd0 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
37fe0 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66 69  XVFS("unix-dotfi
37ff0 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f 46  le",  dotlockIoF
38000 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
38010 58 56 46 53 28 22 75 6e 69 78 2d 65 78 63 6c 22  XVFS("unix-excl"
38020 2c 20 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e  ,     posixIoFin
38030 64 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f 56 58  der ),.#if OS_VX
38040 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56 46  WORKS.    UNIXVF
38050 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73 65 6d  S("unix-namedsem
38060 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72 20 29  ", semIoFinder )
38070 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ,.#endif.#if SQL
38080 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
38090 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 55 4e 49  NG_STYLE.    UNI
380a0 58 56 46 53 28 22 75 6e 69 78 2d 70 6f 73 69 78  XVFS("unix-posix
380b0 22 2c 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e  ",    posixIoFin
380c0 64 65 72 20 29 2c 0a 23 69 66 20 21 4f 53 5f 56  der ),.#if !OS_V
380d0 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56  XWORKS.    UNIXV
380e0 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c  FS("unix-flock",
380f0 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65      flockIoFinde
38100 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64  r ),.#endif.#end
38110 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
38120 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
38130 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
38140 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 55 4e 49  APPLE__).    UNI
38150 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22 2c  XVFS("unix-afp",
38160 20 20 20 20 20 20 61 66 70 49 6f 46 69 6e 64 65        afpIoFinde
38170 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53  r ),.    UNIXVFS
38180 28 22 75 6e 69 78 2d 6e 66 73 22 2c 20 20 20 20  ("unix-nfs",    
38190 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 20 29 2c    nfsIoFinder ),
381a0 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
381b0 69 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 70 72  ix-proxy",    pr
381c0 6f 78 79 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  oxyIoFinder ),.#
381d0 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75 6e 73  endif.  };.  uns
381e0 69 67 6e 65 64 20 69 6e 74 20 69 3b 20 20 20 20  igned int i;    
381f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
38200 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 44  unter */..  /* D
38210 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74  ouble-check that
38220 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20   the aSyscall[] 
38230 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20 63  array has been c
38240 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20  onstructed.  ** 
38250 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20  correctly.  See 
38260 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38  ticket [bb3a86e8
38270 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20  90c8e96ab] */.  
38280 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
38290 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 31 38 20  e(aSyscall)==18 
382a0 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65  );..  /* Registe
382b0 72 20 61 6c 6c 20 56 46 53 65 73 20 64 65 66 69  r all VFSes defi
382c0 6e 65 64 20 69 6e 20 74 68 65 20 61 56 66 73 5b  ned in the aVfs[
382d0 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72  ] array */.  for
382e0 28 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28  (i=0; i<(sizeof(
382f0 61 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c  aVfs)/sizeof(sql
38300 69 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29  ite3_vfs)); i++)
38310 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
38320 73 5f 72 65 67 69 73 74 65 72 28 26 61 56 66 73  s_register(&aVfs
38330 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a  [i], i==0);.  }.
38340 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
38350 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68  OK; .}../*.** Sh
38360 75 74 64 6f 77 6e 20 74 68 65 20 6f 70 65 72 61  utdown the opera
38370 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65  ting system inte
38380 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  rface..**.** Som
38390 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
383a0 65 6d 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ems might need t
383b0 6f 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61 6e 75  o do some cleanu
383c0 70 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  p in this routin
383d0 65 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65  e,.** to release
383e0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
383f0 6f 63 61 74 65 64 20 6f 62 6a 65 63 74 73 2e 20  ocated objects. 
38400 20 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e 69 78   But not on unix
38410 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
38420 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  e is a no-op for
38430 20 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71   unix..*/.int sq
38440 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69  lite3_os_end(voi
38450 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51  d){ .  return SQ
38460 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65  LITE_OK; .}. .#e
38470 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
38480 53 5f 55 4e 49 58 20 2a 2f 0a                    S_UNIX */.