/ Hex Artifact Content
Login

Artifact fad4c9cbf89aa5e5de1f5972458c39bd75418b16:


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 0a 23 69 66  .h>.#endif...#if
1170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1180: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1190: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
11a0: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
11b0: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11c0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11d0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11e0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11f0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
1200: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
1210: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1220: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1230: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1240: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1250: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1260: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1270: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1280: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1290: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
12a0: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
12b0: 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45  dif..#ifdef HAVE
12c0: 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65  _UTIME.# include
12d0: 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69   <utime.h>.#endi
12e0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  f../*.** Allowed
12f0: 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46   values of unixF
1300: 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23  ile.fsFlags.*/.#
1310: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53  define SQLITE_FS
1320: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20  FLAGS_IS_MSDOS  
1330: 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66     0x1../*.** If
1340: 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68   we are to be th
1350: 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75  read-safe, inclu
1360: 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20  de the pthreads 
1370: 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e  header and defin
1380: 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  e.** the SQLITE_
1390: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63  UNIX_THREADS mac
13a0: 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ro..*/.#if SQLIT
13b0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69  E_THREADSAFE.# i
13c0: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
13d0: 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  h>.# define SQLI
13e0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
13f0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
1400: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
1410: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
1420: 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a  g a new file.*/.
1430: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
1440: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
1450: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
1460: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1470: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
1480: 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0644.#endif../*
1490: 0a 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 2a 2f 0a 23 69 66 6e 64 65 66 20   dir.*/.#ifndef 
14d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
14e0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
14f0: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
1500: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
1510: 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
1520: 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0755.#endif../*
1530: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70  .** Maximum supp
1540: 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74  orted path-lengt
1550: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  h..*/.#define MA
1560: 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a  X_PATHNAME 512..
1570: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
1580: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
1590: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
15a0: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
15b0: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
15c0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
15d0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
15e0: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
15f0: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
1600: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
1610: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1620: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1630: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1640: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1650: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1660: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1670: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1680: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1690: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
16a0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
16b0: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
16c0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
16d0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
16e0: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
16f0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
1700: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
1710: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1720: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1730: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1740: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1750: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1760: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1770: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
1780: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
1790: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
17a0: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
17b0: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
17c0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
17d0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
17e0: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
17f0: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
1800: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
1810: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1820: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1830: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1840: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1850: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1860: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1870: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
1880: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
1890: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
18a0: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
18d0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
18e0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
18f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
1900: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
1910: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1920: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1930: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1940: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1950: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1960: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1970: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1980: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1990: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
19a0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
19b0: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
19c0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
19d0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
19e0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19f0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
1a00: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
1a10: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1a20: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1a30: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1a40: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1a50: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1a60: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a80: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1a90: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1aa0: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1ab0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
1ae0: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
1af0: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1b20: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1b30: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1b40: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1b60: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1b70: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1b80: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1b90: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1ba0: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1bb0: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1bc0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1bd0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1c00: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1c10: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1c20: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1c30: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1c40: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1c50: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1c60: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1c70: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1c90: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1ca0: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1cb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cd0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1ce0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1cf0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1d20: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1d30: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1d40: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d60: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1d70: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1d80: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  */.#ifdef __QNXN
1d90: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1da0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1dc0: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1dd0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1de0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1e00: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1e10: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e20: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1e30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1e40: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1e50: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1e80: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1e90: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1ea0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1eb0: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1ec0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1ed0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1ee0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1ef0: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1f00: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1f10: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1f20: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1f30: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1f40: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1f50: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1f60: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1f70: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1f80: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1f90: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1fa0: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1fb0: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1fc0: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1fd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1fe0: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1ff0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
2000: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
2010: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
2020: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
2030: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
2040: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
2050: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
2060: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
2070: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
2080: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
2090: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20a0: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
20b0: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
20c0: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
20d0: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
20e0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
20f0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
2100: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2110: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2120: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
2130: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2140: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2150: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2160: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2170: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2180: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2190: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
21a0: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
21b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
21c0: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
21d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
21e0: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
21f0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64  peration */.#end
2200: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
2210: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
2220: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
2230: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
2240: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
2250: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
2260: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
2270: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
2280: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
2290: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
22a0: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
22b0: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
22c0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
22d0: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e  alues for the un
22e0: 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73  ixFile.ctrlFlags
22f0: 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65   bitmask:.*/.#de
2300: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58  fine UNIXFILE_EX
2310: 43 4c 20 20 20 20 20 20 20 20 30 78 30 31 20 20  CL        0x01  
2320: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2330: 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65  s from one proce
2340: 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69  ss only */.#defi
2350: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e  ne UNIXFILE_RDON
2360: 4c 59 20 20 20 20 20 20 30 78 30 32 20 20 20 20  LY      0x02    
2370: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
2380: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23  s read only */.#
2390: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
23a0: 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34  PERSIST_WAL 0x04
23b0: 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65       /* Persiste
23c0: 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23  nt WAL mode */.#
23d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
23e0: 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20  SABLE_DIRSYNC.# 
23f0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2400: 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 38 20  DIRSYNC    0x08 
2410: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
2420: 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a   sync needed */.
2430: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55  #else.# define U
2440: 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
2450: 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66 0a 23     0x00.#endif.#
2460: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2470: 50 53 4f 57 20 20 20 20 20 20 20 20 30 78 31 30  PSOW        0x10
2480: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49       /* SQLITE_I
2490: 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
24a0: 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64 65 66  VERWRITE */.#def
24b0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  ine UNIXFILE_DEL
24c0: 45 54 45 20 20 20 20 20 20 30 78 32 30 20 20 20  ETE      0x20   
24d0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
24e0: 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lose */.#define 
24f0: 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20 20 20  UNIXFILE_URI    
2500: 20 20 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a       0x40     /*
2510: 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20   Filename might 
2520: 68 61 76 65 20 71 75 65 72 79 20 70 61 72 61 6d  have query param
2530: 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65  eters */.#define
2540: 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
2550: 20 20 20 20 20 20 30 78 38 30 20 20 20 20 20 2f        0x80     /
2560: 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63  * Do no file loc
2570: 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  king */../*.** I
2580: 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74  nclude code that
2590: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c   is common to al
25a0: 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a  l os_*.c files.*
25b0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63  /.#include "os_c
25c0: 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  ommon.h"../*.** 
25d0: 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d  Define various m
25e0: 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d  acros that are m
25f0: 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65  issing from some
2600: 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66   systems..*/.#if
2610: 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45  ndef O_LARGEFILE
2620: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47  .# define O_LARG
2630: 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23  EFILE 0.#endif.#
2640: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  ifdef SQLITE_DIS
2650: 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66  ABLE_LFS.# undef
2660: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
2670: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
2680: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  E 0.#endif.#ifnd
2690: 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20  ef O_NOFOLLOW.# 
26a0: 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f  define O_NOFOLLO
26b0: 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  W 0.#endif.#ifnd
26c0: 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65  ef O_BINARY.# de
26d0: 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a  fine O_BINARY 0.
26e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
26f0: 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f  e threadid macro
2700: 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65   resolves to the
2710: 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f   thread-id or to
2720: 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a   0.  Used for.**
2730: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
2740: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
2750: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
2760: 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68  DSAFE.#define th
2770: 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73  readid pthread_s
2780: 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66  elf().#else.#def
2790: 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23  ine threadid 0.#
27a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66  endif../*.** Dif
27b0: 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74  ferent Unix syst
27c0: 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e  ems declare open
27d0: 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  () in different 
27e0: 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a  ways.  Same use.
27f0: 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  ** open(const ch
2800: 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e  ar*,int,mode_t).
2810: 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65    Others use ope
2820: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
2830: 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64  t,...)..** The d
2840: 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70  ifference is imp
2850: 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e  ortant when usin
2860: 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  g a pointer to t
2870: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  he function..**.
2880: 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61  ** The safest wa
2890: 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  y to deal with t
28a0: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f  he problem is to
28b0: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73   always use this
28c0: 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63   wrapper.** whic
28d0: 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65  h always has the
28e0: 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e   same well-defin
28f0: 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ed interface..*/
2900: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
2910: 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  xOpen(const char
2920: 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61   *zFile, int fla
2930: 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20  gs, int mode){. 
2940: 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69   return open(zFi
2950: 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29  le, flags, mode)
2960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f  ;.}../*.** On so
2970: 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c  me systems, call
2980: 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69  s to fchown() wi
2990: 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73  ll trigger a mes
29a0: 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69  sage in a securi
29b0: 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65  ty.** log if the
29c0: 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d  y come from non-
29d0: 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20  root processes. 
29e0: 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e   So avoid callin
29f0: 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a  g fchown() if.**
2a00: 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e   we are not runn
2a10: 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a  ing as root..*/.
2a20: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
2a30: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
2a40: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
2a50: 67 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 67  gid){.  return g
2a60: 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20 66  eteuid() ? 0 : f
2a70: 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64  chown(fd,uid,gid
2a80: 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  );.}../* Forward
2a90: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
2aa0: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
2ab0: 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
2ac0: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a  r*, int*);../*.*
2ad0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
2ae0: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2af0: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2b00: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2b10: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2b20: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2b30: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2b40: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2b50: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2b60: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2b70: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2b80: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
2b90: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
2ba0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
2bb0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
2bc0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
2bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
2be0: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2bf0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2c00: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2c10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2c20: 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20   sytem call */. 
2c30: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2c40: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
2c50: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
2c60: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2c70: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2c80: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
2c90: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
2ca0: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
2cb0: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
2cc0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
2cd0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2ce0: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
2cf0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2d00: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
2d10: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
2d20: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
2d30: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
2d40: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
2d50: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2d60: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
2d70: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2d80: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
2d90: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
2da0: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
2db0: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
2dc0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2dd0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
2de0: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
2df0: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
2e00: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2e10: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
2e20: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
2e30: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
2e40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2e50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
2e60: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
2e70: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
2e80: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
2e90: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
2ea0: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2eb0: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
2ec0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2ed0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
2ee0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
2ef0: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
2f00: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2f10: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
2f20: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
2f30: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
2f40: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
2f50: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
2f60: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
2f70: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
2f80: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
2f90: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
2fa0: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
2fb0: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
2fc0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
2fd0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
2fe0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
2ff0: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
3000: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
3010: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
3020: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
3030: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
3040: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
3050: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
3060: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
3070: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
3080: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
3090: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
30a0: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
30b0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
30c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
30d0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
30e0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
30f0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
3100: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
3110: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
3120: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
3130: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
3140: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3150: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
3160: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3170: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
3180: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
3190: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
31a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
31b0: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
31c0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
31d0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
31e0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
31f0: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
3200: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
3210: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
3220: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
3230: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3240: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
3250: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
3260: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
3270: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3280: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
3290: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
32a0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
32b0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
32c0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
32d0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
32e0: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
32f0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3300: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
3310: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3320: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3330: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3340: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3350: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3360: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3370: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3380: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
3390: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
33a0: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
33b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
33c0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
33d0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
33e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
33f0: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
3400: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3410: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3420: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3430: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3440: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3450: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20  fine osPread64  
3460: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3470: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3480: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
3490: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
34a0: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
34b0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
34c0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
34d0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
34e0: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
34f0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3500: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3510: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3520: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3530: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3540: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3550: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3560: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3570: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3580: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
3590: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
35a0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
35b0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
35c0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
35d0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
35e0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
35f0: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
3600: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3610: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3620: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3630: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3640: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3650: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3660: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3670: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3680: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3690: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
36a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
36b0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
36c0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
36d0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
36e0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
36f0: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3700: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3710: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3720: 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20  e_t,off_t))\.   
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3740: 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43   aSyscall[13].pC
3750: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3760: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3770: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63  NG_STYLE.  { "fc
3780: 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71  hmod",       (sq
3790: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
37a0: 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20  r)fchmod,     0 
37b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
37c0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
37d0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
37e0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
37f0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3800: 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20  ine osFchmod    
3810: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64  ((int(*)(int,mod
3820: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  e_t))aSyscall[14
3830: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3840: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
3850: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
3860: 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
3870: 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c  LOCATE.  { "fall
3880: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
3890: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
38a0: 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c  posix_fallocate,
38b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
38c0: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
38d0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
38e0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
38f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3900: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61  dif.#define osFa
3910: 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29  llocate ((int(*)
3920: 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74  (int,off_t,off_t
3930: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3940: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75  Current)..  { "u
3950: 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73  nlink",       (s
3960: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3970: 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20  tr)unlink,      
3980: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3990: 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28  e osUnlink    ((
39a0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
39b0: 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  r*))aSyscall[16]
39c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
39d0: 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c  "openDirectory",
39e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
39f0: 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72  call_ptr)openDir
3a00: 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d  ectory,      0 }
3a10: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
3a20: 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28  Directory ((int(
3a30: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3a40: 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37  nt*))aSyscall[17
3a50: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3a60: 20 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20   "mkdir",       
3a70: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3a80: 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20  l_ptr)mkdir,    
3a90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
3aa0: 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20  ine osMkdir     
3ab0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
3ac0: 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79  har*,mode_t))aSy
3ad0: 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65  scall[18].pCurre
3ae0: 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22  nt)..  { "rmdir"
3af0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3b00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d  3_syscall_ptr)rm
3b10: 64 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30  dir,           0
3b20: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d   },.#define osRm
3b30: 64 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29  dir     ((int(*)
3b40: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
3b50: 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72  yscall[19].pCurr
3b60: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77  ent)..  { "fchow
3b70: 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  n",       (sqlit
3b80: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3b90: 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20 20 20 20  osixFchown,     
3ba0: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46  0 },.#define osF
3bb0: 63 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a  chown    ((int(*
3bc0: 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f  )(int,uid_t,gid_
3bd0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e  t))aSyscall[20].
3be0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3bf0: 75 6d 61 73 6b 22 2c 20 20 20 20 20 20 20 20 28  umask",        (
3c00: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c10: 70 74 72 29 75 6d 61 73 6b 2c 20 20 20 20 20 20  ptr)umask,      
3c20: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3c30: 65 20 6f 73 55 6d 61 73 6b 20 20 20 20 20 28 28  e osUmask     ((
3c40: 6d 6f 64 65 5f 74 28 2a 29 28 6d 6f 64 65 5f 74  mode_t(*)(mode_t
3c50: 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70  ))aSyscall[21].p
3c60: 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20  Current)..}; /* 
3c70: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
3c80: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
3c90: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
3ca0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
3cb0: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
3cc0: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
3cd0: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
3ce0: 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73  .** "unix" VFSes
3cf0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
3d00: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
3d10: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
3d20: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
3d30: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
3d40: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
3d50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
3d60: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
3d70: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
3d80: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
3d90: 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65  int unixSetSyste
3da0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
3db0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
3dc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
3dd0: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
3de0: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
3df0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
3e00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
3e10: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
3e20: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
3e30: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3e40: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
3e50: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
3e60: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
3e70: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
3e80: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
3e90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
3ea0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
3eb0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
3ec0: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
3ed0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
3ee0: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
3ef0: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
3f00: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
3f10: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
3f20: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
3f30: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
3f40: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
3f50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
3f60: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
3f70: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
3f80: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
3f90: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
3fa0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
3fb0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
3fc0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
3fd0: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
3fe0: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
3ff0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
4000: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
4010: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
4020: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
4030: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
4040: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
4050: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
4060: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
4070: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
4080: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
4090: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
40a0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
40b0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
40c0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
40d0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
40e0: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
40f0: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
4100: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
4110: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4120: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
4130: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
4140: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
4150: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
4160: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
4170: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
4180: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
4190: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
41a0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
41b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
41c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
41d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
41e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
41f0: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
4200: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4210: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
4220: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
4230: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
4240: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
4250: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
4260: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
4270: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
4280: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
4290: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
42a0: 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74  call_ptr unixGet
42b0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
42c0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
42d0: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
42e0: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
42f0: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
4300: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4310: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
4320: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4330: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
4340: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
4350: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
4360: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4370: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
4380: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
4390: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
43a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
43b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
43c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
43d0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
43e0: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
43f0: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
4400: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
4410: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
4420: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
4430: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
4440: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
4450: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
4460: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
4470: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
4480: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
4490: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
44a0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
44b0: 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
44c0: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
44d0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
44e0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
44f0: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
4500: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
4510: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
4520: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
4530: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
4540: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4550: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
4560: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4570: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
4580: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
4590: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
45a0: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
45b0: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
45c0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
45d0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
45e0: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
45f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4600: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65  /*.** Invoke ope
4610: 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74  n().  Do so mult
4620: 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69  iple times, unti
4630: 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63  l it either succ
4640: 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73  eeds or.** fails
4650: 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e   for some reason
4660: 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54   other than EINT
4670: 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  R..**.** If the 
4680: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
4690: 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e  de "m" is 0 then
46a0: 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64   set it to the d
46b0: 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51  efault for.** SQ
46c0: 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75  Lite.  The defau
46d0: 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46  lt is SQLITE_DEF
46e0: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
46f0: 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a  SIONS (normally.
4700: 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69  ** 0644) as modi
4710: 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74  fied by the syst
4720: 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20  em umask.  If m 
4730: 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a  is not 0, then.*
4740: 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
4750: 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65  creation mode be
4760: 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72   exactly m ignor
4770: 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a  ing the umask..*
4780: 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d  *.** The m param
4790: 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e  eter will be non
47a0: 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20  -zero only when 
47b0: 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d  creating -wal, -
47c0: 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20  journal,.** and 
47d0: 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20  -shm files.  We 
47e0: 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73  want those files
47f0: 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c   to have *exactl
4800: 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70  y* the same.** p
4810: 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68  ermissions as th
4820: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
4830: 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72  abase, unadulter
4840: 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  ated by the umas
4850: 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61  k..** In that wa
4860: 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65  y, if a database
4870: 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d   file is -rw-rw-
4880: 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c  rw or -rw-rw-r-,
4890: 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61   and a.** transa
48a0: 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e  ction crashes an
48b0: 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20  d leaves behind 
48c0: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  hot journals, th
48d0: 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73  en any.** proces
48e0: 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74  s that is able t
48f0: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  o write to the d
4900: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73  atabase will als
4910: 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  o be able to.** 
4920: 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20  recover the hot 
4930: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61  journals..*/.sta
4940: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f  tic int robust_o
4950: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
4960: 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74  z, int f, mode_t
4970: 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20   m){.  int fd;. 
4980: 20 6d 6f 64 65 5f 74 20 6d 32 3b 0a 20 20 6d 6f   mode_t m2;.  mo
4990: 64 65 5f 74 20 6f 72 69 67 4d 20 3d 20 30 3b 0a  de_t origM = 0;.
49a0: 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20    if( m==0 ){.  
49b0: 20 20 6d 32 20 3d 20 53 51 4c 49 54 45 5f 44 45    m2 = SQLITE_DE
49c0: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
49d0: 53 53 49 4f 4e 53 3b 0a 20 20 7d 65 6c 73 65 7b  SSIONS;.  }else{
49e0: 0a 20 20 20 20 6d 32 20 3d 20 6d 3b 0a 20 20 20  .    m2 = m;.   
49f0: 20 6f 72 69 67 4d 20 3d 20 6f 73 55 6d 61 73 6b   origM = osUmask
4a00: 28 30 29 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 23  (0);.  }.  do{.#
4a10: 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f  if defined(O_CLO
4a20: 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20 6f  EXEC).    fd = o
4a30: 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45  sOpen(z,f|O_CLOE
4a40: 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20  XEC,m2);.#else. 
4a50: 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a     fd = osOpen(z
4a60: 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20  ,f,m2);.#endif. 
4a70: 20 7d 77 68 69 6c 65 28 20 66 64 3c 30 20 26 26   }while( fd<0 &&
4a80: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
4a90: 0a 20 20 69 66 28 20 6d 20 29 7b 0a 20 20 20 20  .  if( m ){.    
4aa0: 6f 73 55 6d 61 73 6b 28 6f 72 69 67 4d 29 3b 0a  osUmask(origM);.
4ab0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
4ac0: 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28  FD_CLOEXEC) && (
4ad0: 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58  !defined(O_CLOEX
4ae0: 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43  EC) || O_CLOEXEC
4af0: 3d 3d 30 29 0a 20 20 69 66 28 20 66 64 3e 3d 30  ==0).  if( fd>=0
4b00: 20 29 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46   ) osFcntl(fd, F
4b10: 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
4b20: 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
4b30: 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
4b40: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 66  endif.  return f
4b50: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  d;.}../*.** Help
4b60: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
4b70: 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
4b80: 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
4b90: 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67   mutex. The.** g
4ba0: 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75  lobal mutex is u
4bb0: 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74  sed to protect t
4bc0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
4bd0: 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46   and.** vxworksF
4be0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73  ileId objects us
4bf0: 65 64 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c  ed by this file,
4c00: 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61   all of which ma
4c10: 79 20 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20  y be .** shared 
4c20: 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  by multiple thre
4c30: 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74  ads..**.** Funct
4c40: 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  ion unixMutexHel
4c50: 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  d() is used to a
4c60: 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
4c70: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a   global mutex .*
4c80: 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72  * is held when r
4c90: 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75  equired. This fu
4ca0: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
4cb0: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
4cc0: 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74  ssert() .** stat
4cd0: 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a  ements. e.g..**.
4ce0: 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  **   unixEnterMu
4cf0: 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73  tex().**     ass
4d00: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
4d10: 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69  ld() );.**   uni
4d20: 78 45 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f  xEnterLeave().*/
4d30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
4d40: 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64  xEnterMutex(void
4d50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
4d60: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
4d70: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
4d80: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
4d90: 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69  ASTER));.}.stati
4da0: 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65  c void unixLeave
4db0: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
4dc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
4dd0: 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
4de0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
4df0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
4e00: 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
4e10: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
4e20: 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  int unixMutexHel
4e30: 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
4e40: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
4e50: 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74  _held(sqlite3Mut
4e60: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
4e70: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
4e80: 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ER));.}.#endif..
4e90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4ea0: 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66  ITE_TEST) && def
4eb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
4ec0: 47 29 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  G)./*.** Helper 
4ed0: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69  function for pri
4ee0: 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20  nting out trace 
4ef0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
4f00: 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69   debugging.** bi
4f10: 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74  naries. This ret
4f20: 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20  urns the string 
4f30: 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66  represetation of
4f40: 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a   the supplied.**
4f50: 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79   integer lock-ty
4f60: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  pe..*/.static co
4f70: 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65  nst char *azFile
4f80: 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f  Lock(int eFileLo
4f90: 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65  ck){.  switch( e
4fa0: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
4fb0: 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65  case NO_LOCK: re
4fc0: 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20  turn "NONE";.   
4fd0: 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43   case SHARED_LOC
4fe0: 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45  K: return "SHARE
4ff0: 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53  D";.    case RES
5000: 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  ERVED_LOCK: retu
5010: 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20  rn "RESERVED";. 
5020: 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f     case PENDING_
5030: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45  LOCK: return "PE
5040: 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65  NDING";.    case
5050: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
5060: 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49   return "EXCLUSI
5070: 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VE";.  }.  retur
5080: 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e  n "ERROR";.}.#en
5090: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
50a0: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a  TE_LOCK_TRACE./*
50b0: 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e  .** Print out in
50c0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
50d0: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  all locking oper
50e0: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
50f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5100: 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  ed for troublesh
5110: 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ooting locks on 
5120: 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a  multithreaded.**
5130: 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61   platforms.  Ena
5140: 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67  ble by compiling
5150: 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49   with the -DSQLI
5160: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a  TE_LOCK_TRACE.**
5170: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
5180: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70  tion on the comp
5190: 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65  iler.  This code
51a0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20   is normally.** 
51b0: 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73  turned off..*/.s
51c0: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72  tatic int lockTr
51d0: 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ace(int fd, int 
51e0: 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  op, struct flock
51f0: 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f   *p){.  char *zO
5200: 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20  pName, *zType;. 
5210: 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61   int s;.  int sa
5220: 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20  vedErrno;.  if( 
5230: 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20  op==F_GETLK ){. 
5240: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45     zOpName = "GE
5250: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TLK";.  }else if
5260: 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b  ( op==F_SETLK ){
5270: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
5280: 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  SETLK";.  }else{
5290: 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c  .    s = osFcntl
52a0: 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20  (fd, op, p);.   
52b0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
52c0: 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f  ntf("fcntl unkno
52d0: 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20  wn %d %d %d\n", 
52e0: 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20  fd, op, s);.    
52f0: 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20  return s;.  }.  
5300: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
5310: 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _RDLCK ){.    zT
5320: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
5330: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
5340: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
5350: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52  .    zType = "WR
5360: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
5370: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( p->l_type==F_U
5380: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  NLCK ){.    zTyp
5390: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d  e = "UNLCK";.  }
53a0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
53b0: 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ( 0 );.  }.  ass
53c0: 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65  ert( p->l_whence
53d0: 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20  ==SEEK_SET );.  
53e0: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  s = osFcntl(fd, 
53f0: 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45  op, p);.  savedE
5400: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
5410: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
5420: 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20  tf("fcntl %d %d 
5430: 25 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25  %s %s %d %d %d %
5440: 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61  d\n",.     threa
5450: 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65  did, fd, zOpName
5460: 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d  , zType, (int)p-
5470: 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70  >l_start, (int)p
5480: 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69  ->l_len,.     (i
5490: 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b  nt)p->l_pid, s);
54a0: 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26  .  if( s==(-1) &
54b0: 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26  & op==F_SETLK &&
54c0: 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52   (p->l_type==F_R
54d0: 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70  DLCK || p->l_typ
54e0: 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20  e==F_WRLCK) ){. 
54f0: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
5500: 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b  l2;.    l2 = *p;
5510: 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c  .    osFcntl(fd,
5520: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a   F_GETLK, &l2);.
5530: 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70      if( l2.l_typ
5540: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
5550: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
5560: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  CK";.    }else i
5570: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
5580: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  WRLCK ){.      z
5590: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
55a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
55b0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  .l_type==F_UNLCK
55c0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
55d0: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "UNLCK";.    }
55e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
55f0: 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20  rt( 0 );.    }. 
5600: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
5610: 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69  rintf("fcntl-fai
5620: 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20  lure-reason: %s 
5630: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
5640: 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29      zType, (int)
5650: 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  l2.l_start, (int
5660: 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29  )l2.l_len, (int)
5670: 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20  l2.l_pid);.  }. 
5680: 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72   errno = savedEr
5690: 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b  rno;.  return s;
56a0: 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74  .}.#undef osFcnt
56b0: 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  l.#define osFcnt
56c0: 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64  l lockTrace.#end
56d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  if /* SQLITE_LOC
56e0: 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  K_TRACE */../*.*
56f0: 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74  * Retry ftruncat
5700: 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  e() calls that f
5710: 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52  ail due to EINTR
5720: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5730: 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
5740: 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69  int h, sqlite3_i
5750: 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20  nt64 sz){.  int 
5760: 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f  rc;.  do{ rc = o
5770: 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a 29  sFtruncate(h,sz)
5780: 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
5790: 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
57a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
57b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
57c0: 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20  tine translates 
57d0: 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58  a standard POSIX
57e0: 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f   errno code into
57f0: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73   something.** us
5800: 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65  eful to the clie
5810: 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  nts of the sqlit
5820: 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53  e3 functions.  S
5830: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20  pecifically, it 
5840: 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74  is.** intended t
5850: 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61  o translate a va
5860: 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61 67  riety of "try ag
5870: 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  ain" errors into
5880: 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20   SQLITE_BUSY.** 
5890: 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f 66  and a variety of
58a0: 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74   "please close t
58b0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
58c0: 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69  or NOW" errors i
58d0: 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49  nto .** SQLITE_I
58e0: 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f  OERR.** .** Erro
58f0: 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  rs during initia
5900: 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b  lization of lock
5910: 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65  s, or file syste
5920: 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f  m support for lo
5930: 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68  cks,.** should h
5940: 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e  andle ENOLCK, EN
5950: 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50  OTSUP, EOPNOTSUP
5960: 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f  P separately..*/
5970: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
5980: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
5990: 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45  Error(int posixE
59a0: 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65  rror, int sqlite
59b0: 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74 63  IOErr) {.  switc
59c0: 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b  h (posixError) {
59d0: 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f  .#if 0.  /* At o
59e0: 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 63 6f  ne point this co
59f0: 64 65 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65  de was not comme
5a00: 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20 74 68 65  nted out. In the
5a10: 6f 72 79 2c 20 74 68 69 73 20 62 72 61 6e 63 68  ory, this branch
5a20: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76  .  ** should nev
5a30: 65 72 20 62 65 20 68 69 74 2c 20 61 73 20 74 68  er be hit, as th
5a40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
5a50: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
5a60: 64 20 61 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c  d after.  ** a l
5a70: 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65 64 20 66  ocking-related f
5a80: 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63  unction (i.e. fc
5a90: 6e 74 6c 28 29 29 20 68 61 73 20 72 65 74 75 72  ntl()) has retur
5aa0: 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74  ned non-zero wit
5ab0: 68 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65  h.  ** the value
5ac0: 20 6f 66 20 65 72 72 6e 6f 20 61 73 20 74 68 65   of errno as the
5ad0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
5ae0: 20 53 69 6e 63 65 20 61 20 73 79 73 74 65 6d 20   Since a system 
5af0: 63 61 6c 6c 20 68 61 73 20 66 61 69 6c 65 64 2c  call has failed,
5b00: 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75  .  ** errno shou
5b10: 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  ld be non-zero..
5b20: 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74    **.  ** Despit
5b30: 65 20 74 68 69 73 2c 20 69 66 20 65 72 72 6e 6f  e this, if errno
5b40: 20 72 65 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c   really is zero,
5b50: 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20   we still don't 
5b60: 77 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 0a 20  want to return. 
5b70: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54   ** SQLITE_OK. T
5b80: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 66  he system call f
5b90: 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65  ailed, and *some
5ba0: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 73  * SQLite error s
5bb0: 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72  hould be.  ** pr
5bc0: 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20 74 6f  opagated back to
5bd0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d   the caller. Com
5be0: 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 62 72 61  menting this bra
5bf0: 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73 20 65 72  nch out means er
5c00: 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c  rno==0.  ** will
5c10: 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
5c20: 68 65 20 22 64 65 66 61 75 6c 74 3a 22 20 63 61  he "default:" ca
5c30: 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  se below..  */. 
5c40: 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72 65   case 0: .    re
5c50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5c60: 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65 20 45  #endif..  case E
5c70: 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54  AGAIN:.  case ET
5c80: 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20  IMEDOUT:.  case 
5c90: 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49  EBUSY:.  case EI
5ca0: 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c  NTR:.  case ENOL
5cb0: 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e  CK:  .    /* ran
5cc0: 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72  dom NFS retry er
5cd0: 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  ror, unless duri
5ce0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
5cf0: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
5d00: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
5d10: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
5d20: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
5d30: 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74   says */.    ret
5d40: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
5d50: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43  .    .  case EAC
5d60: 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43  CES: .    /* EAC
5d70: 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41  CES is like EAGA
5d80: 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e  IN during lockin
5d90: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75  g operations, bu
5da0: 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20  t not any other 
5db0: 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28  time*/.    if( (
5dc0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
5dd0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
5de0: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 73  ) || .        (s
5df0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
5e00: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
5e10: 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28  K) || .        (
5e20: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
5e30: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
5e40: 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 28  CK) ||.        (
5e50: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
5e60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
5e70: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29  KRESERVEDLOCK) )
5e80: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
5e90: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
5ea0: 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61  }.    /* else fa
5eb0: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
5ec0: 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20  case EPERM: .   
5ed0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
5ee0: 45 52 4d 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 45  ERM;.    .  /* E
5ef0: 44 45 41 44 4c 4b 20 69 73 20 6f 6e 6c 79 20 70  DEADLK is only p
5f00: 6f 73 73 69 62 6c 65 20 69 66 20 61 20 63 61 6c  ossible if a cal
5f10: 6c 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  l to fcntl(F_SET
5f20: 4c 4b 57 29 20 69 73 20 6d 61 64 65 2e 20 41 6e  LKW) is made. An
5f30: 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d 6f 64 75  d.  ** this modu
5f40: 6c 65 20 6e 65 76 65 72 20 6d 61 6b 65 73 20 73  le never makes s
5f50: 75 63 68 20 61 20 63 61 6c 6c 2e 20 41 6e 64 20  uch a call. And 
5f60: 74 68 65 20 63 6f 64 65 20 69 6e 20 53 51 4c 69  the code in SQLi
5f70: 74 65 20 69 74 73 65 6c 66 20 0a 20 20 2a 2a 20  te itself .  ** 
5f80: 61 73 73 65 72 74 73 20 74 68 61 74 20 53 51 4c  asserts that SQL
5f90: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
5fa0: 44 20 69 73 20 6e 65 76 65 72 20 72 65 74 75 72  D is never retur
5fb0: 6e 65 64 2e 20 46 6f 72 20 74 68 65 73 65 20 72  ned. For these r
5fc0: 65 61 73 6f 6e 73 0a 20 20 2a 2a 20 74 68 69 73  easons.  ** this
5fd0: 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 63 6f   case is also co
5fe0: 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 66 20  mmented out. If 
5ff0: 74 68 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20  the system does 
6000: 73 65 74 20 65 72 72 6e 6f 20 74 6f 20 45 44 45  set errno to EDE
6010: 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74 68 65 20 64  ADLK,.  ** the d
6020: 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f 49 4f  efault SQLITE_IO
6030: 45 52 52 5f 58 58 58 20 63 6f 64 65 20 77 69 6c  ERR_XXX code wil
6040: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 2a  l be returned. *
6050: 2f 0a 23 69 66 20 30 0a 20 20 63 61 73 65 20 45  /.#if 0.  case E
6060: 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75  DEADLK:.    retu
6070: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
6080: 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e 64 69 66 0a  BLOCKED;.#endif.
6090: 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53      .#if EOPNOTS
60a0: 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63  UPP!=ENOTSUP.  c
60b0: 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20  ase EOPNOTSUPP: 
60c0: 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e  .    /* somethin
60d0: 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20  g went terribly 
60e0: 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72  awry, unless dur
60f0: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
6100: 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20  support .     * 
6110: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
6120: 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61  n which it actua
6130: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
6140: 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66  t says */.#endif
6150: 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a  .#ifdef ENOTSUP.
6160: 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20    case ENOTSUP: 
6170: 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20  .    /* invalid 
6180: 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  fd, unless durin
6190: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
61a0: 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74  pport introspect
61b0: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20  ion, in which . 
61c0: 20 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c      * it actuall
61d0: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
61e0: 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  says */.#endif. 
61f0: 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73   case EIO:.  cas
6200: 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20  e EBADF:.  case 
6210: 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45  EINVAL:.  case E
6220: 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20  NOTCONN:.  case 
6230: 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45  ENODEV:.  case E
6240: 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f  NXIO:.  case ENO
6250: 45 4e 54 3a 0a 23 69 66 64 65 66 20 45 53 54 41  ENT:.#ifdef ESTA
6260: 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
6270: 20 20 20 20 20 20 20 2f 2a 20 45 53 54 41 4c 45         /* ESTALE
6280: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
6290: 6f 6e 20 49 6e 74 65 72 69 78 20 73 79 73 74 65  on Interix syste
62a0: 6d 73 20 2a 2f 0a 20 20 63 61 73 65 20 45 53 54  ms */.  case EST
62b0: 41 4c 45 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61  ALE:.#endif.  ca
62c0: 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f  se ENOSYS:.    /
62d0: 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66  * these should f
62e0: 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20  orce the client 
62f0: 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  to close the fil
6300: 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20  e and reconnect 
6310: 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c  */.    .  defaul
6320: 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73  t: .    return s
6330: 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a  qliteIOErr;.  }.
6340: 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }..../**********
6350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6390: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
63a0: 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e  ******* Begin Un
63b0: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
63c0: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
63d0: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
63e0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f  ****.**.** On mo
63f0: 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75  st versions of u
6400: 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20  nix, we can get 
6410: 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20  a unique ID for 
6420: 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74  a file by concat
6430: 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64  enating.** the d
6440: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64  evice number and
6450: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
6460: 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f 65  r.  But this doe
6470: 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78  s not work on Vx
6480: 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57  Works..** On VxW
6490: 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66  orks, a unique f
64a0: 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20 62  ile id must be b
64b0: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f  ased on the cano
64c0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  nical filename..
64d0: 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  **.** A pointer 
64e0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
64f0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
6500: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
6510: 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e   used as a.** un
6520: 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20  ique file ID in 
6530: 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69  VxWorks.  Each i
6540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
6550: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
6560: 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20  ns.** a copy of 
6570: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
6580: 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69  lename.  There i
6590: 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e  s also a referen
65a0: 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54  ce count.  .** T
65b0: 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  he structure is 
65c0: 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74  reclaimed when t
65d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69  he number of poi
65e0: 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70  nters to it drop
65f0: 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a  s to.** zero..**
6600: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65  .** There are ne
6610: 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69  ver very many fi
6620: 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20  les open at one 
6630: 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73  time and lookups
6640: 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65   are not.** a pe
6650: 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63  rformance-critic
6660: 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69  al path, so it i
6670: 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
6680: 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72  put these.** str
6690: 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e  uctures on a lin
66a0: 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72  ked list..*/.str
66b0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
66c0: 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77  d {.  struct vxw
66d0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78  orksFileId *pNex
66e0: 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61  t;  /* Next in a
66f0: 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c   list of them al
6700: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  l */.  int nRef;
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6730: 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
6740: 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e  this one */.  in
6750: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
6760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6770: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61  ength of the zCa
6780: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74  nonicalName[] st
6790: 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ring */.  char *
67a0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20  zCanonicalName; 
67b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e          /* Canon
67c0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f  ical filename */
67d0: 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .};..#if OS_VXWO
67e0: 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75  RKS./* .** All u
67f0: 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20  nique filenames 
6800: 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69  are held on a li
6810: 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65 64  nked list headed
6820: 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69   by this.** vari
6830: 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20  able:.*/.static 
6840: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6850: 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c  leId *vxworksFil
6860: 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
6870: 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c  * Simplify a fil
6880: 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63  ename into its c
6890: 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a  anonical form.**
68a0: 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66   by making the f
68b0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
68c0: 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76  :.**.**  * remov
68d0: 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67  ing any trailing
68e0: 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f   and duplicate /
68f0: 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f  .**  * convert /
6900: 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a  ./ into just /.*
6910: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f  *  * convert /A/
6920: 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20 61  ../ where A is a
6930: 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69  ny simple name i
6940: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a  nto just /.**.**
6950: 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   Changes are mad
6960: 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74  e in-place.  Ret
6970: 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65  urn the new name
6980: 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54   length..**.** T
6990: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
69a0: 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e  name is in z[0..
69b0: 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68  n-1].  Return th
69c0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  e number of.** c
69d0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
69e0: 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65   simplified name
69f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6a00: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
6a10: 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  ame(char *z, int
6a20: 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   n){.  int i, j;
6a30: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
6a40: 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20   z[n-1]=='/' ){ 
6a50: 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a  n--; }.  for(i=j
6a60: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
6a70: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27     if( z[i]=='/'
6a80: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b   ){.      if( z[
6a90: 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74  i+1]=='/' ) cont
6aa0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
6ab0: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69  z[i+1]=='.' && i
6ac0: 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d  +2<n && z[i+2]==
6ad0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '/' ){.        i
6ae0: 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63   += 1;.        c
6af0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
6b00: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
6b10: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20  ]=='.' && i+3<n 
6b20: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26  && z[i+2]=='.' &
6b30: 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b  & z[i+3]=='/' ){
6b40: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
6b50: 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27  j>0 && z[j-1]!='
6b60: 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  /' ){ j--; }.   
6b70: 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20       if( j>0 ){ 
6b80: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  j--; }.        i
6b90: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63   += 2;.        c
6ba0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
6bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b  .    }.    z[j++
6bc0: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ] = z[i];.  }.  
6bd0: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  z[j] = 0;.  retu
6be0: 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn j;.}../*.** F
6bf0: 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ind a unique fil
6c00: 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69 76  e ID for the giv
6c10: 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  en absolute path
6c20: 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  name.  Return.**
6c30: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6c40: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
6c50: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f  object.  This po
6c60: 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e 69  inter is the uni
6c70: 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a  que.** file ID..
6c80: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66  **.** The nRef f
6c90: 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f  ield of the vxwo
6ca0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
6cb0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
6cc0: 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62  before.** the ob
6cd0: 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65 64  ject is returned
6ce0: 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73  .  A new vxworks
6cf0: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73  FileId object is
6d00: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
6d10: 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f  added to the glo
6d20: 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65  bal list if nece
6d30: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
6d40: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
6d50: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
6d60: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
6d70: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
6d80: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76  vxworksFileId *v
6d90: 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
6da0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62  (const char *zAb
6db0: 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73  soluteName){.  s
6dc0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
6dd0: 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  eId *pNew;      
6de0: 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79     /* search key
6df0: 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44   and new file ID
6e00: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77   */.  struct vxw
6e10: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e  orksFileId *pCan
6e20: 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72  didate;   /* For
6e30: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
6e40: 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20  isting file IDs 
6e50: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
6e80: 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e  th of zAbsoluteN
6e90: 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20  ame string */.. 
6ea0: 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75   assert( zAbsolu
6eb0: 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29  teName[0]=='/' )
6ec0: 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  ;.  n = (int)str
6ed0: 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  len(zAbsoluteNam
6ee0: 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  e);.  pNew = sql
6ef0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
6f00: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b  eof(*pNew) + (n+
6f10: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  1) );.  if( pNew
6f20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6f30: 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63    pNew->zCanonic
6f40: 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  alName = (char*)
6f50: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63  &pNew[1];.  memc
6f60: 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  py(pNew->zCanoni
6f70: 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75  calName, zAbsolu
6f80: 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20  teName, n+1);.  
6f90: 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c  n = vxworksSimpl
6fa0: 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43  ifyName(pNew->zC
6fb0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
6fc0: 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
6fd0: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  or an existing e
6fe0: 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 69  ntry that matchi
6ff0: 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  ng the canonical
7000: 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66   name..  ** If f
7010: 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20  ound, increment 
7020: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
7030: 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  unt and return a
7040: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a   pointer to.  **
7050: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66 69   the existing fi
7060: 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e  le ID..  */.  un
7070: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
7080: 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65    for(pCandidate
7090: 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  =vxworksFileList
70a0: 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43  ; pCandidate; pC
70b0: 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64  andidate=pCandid
70c0: 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ate->pNext){.   
70d0: 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d   if( pCandidate-
70e0: 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20  >nName==n .     
70f0: 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69  && memcmp(pCandi
7100: 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  date->zCanonical
7110: 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e  Name, pNew->zCan
7120: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d  onicalName, n)==
7130: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  0.    ){.       
7140: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
7150: 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64  w);.       pCand
7160: 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  idate->nRef++;. 
7170: 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
7180: 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72  utex();.       r
7190: 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65  eturn pCandidate
71a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
71b0: 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66  * No match was f
71c0: 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d  ound.  We will m
71d0: 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49  ake a new file I
71e0: 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65  D */.  pNew->nRe
71f0: 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e  f = 1;.  pNew->n
7200: 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77  Name = n;.  pNew
7210: 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b  ->pNext = vxwork
7220: 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77  sFileList;.  vxw
7230: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70  orksFileList = p
7240: 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  New;.  unixLeave
7250: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
7260: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7270: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
7280: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
7290: 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  n a vxworksFileI
72a0: 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a  d object.  Free.
72b0: 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68  ** the object wh
72c0: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
72d0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
72e0: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ero..*/.static v
72f0: 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  oid vxworksRelea
7300: 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74 20  seFileId(struct 
7310: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
7320: 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72  Id){.  unixEnter
7330: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
7340: 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29  t( pId->nRef>0 )
7350: 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pId->nRef--;
7360: 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66  .  if( pId->nRef
7370: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
7380: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7390: 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70  **pp;.    for(pp
73a0: 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  =&vxworksFileLis
73b0: 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70  t; *pp && *pp!=p
73c0: 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29  Id; pp = &((*pp)
73d0: 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20  ->pNext)){}.    
73e0: 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64  assert( *pp==pId
73f0: 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49   );.    *pp = pI
7400: 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  d->pNext;.    sq
7410: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b  lite3_free(pId);
7420: 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
7430: 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69  Mutex();.}.#endi
7440: 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
7450: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
7460: 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75  *** End of Uniqu
7470: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
7480: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
7490: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
74a0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
74b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74f0: 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20   Posix Advisory 
7570: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
7580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7590: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58  ****.**.** POSIX
75a0: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
75b0: 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65  are broken by de
75c0: 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20  sign.  ANSI STD 
75d0: 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a  1003.1 (1996).**
75e0: 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32   section 6.5.2.2
75f0: 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75   lines 483 throu
7600: 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74  gh 490 specify t
7610: 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65  hat when a proce
7620: 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c  ss.** sets or cl
7630: 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61  ears a lock, tha
7640: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72  t operation over
7650: 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20  rides any prior 
7660: 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20  locks set.** by 
7670: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7680: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65  .  It does not e
7690: 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f  xplicitly say so
76a0: 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69  , but this impli
76b0: 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76  es.** that it ov
76c0: 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65  errides locks se
76d0: 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  t by the same pr
76e0: 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69  ocess using a di
76f0: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
7700: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e  descriptor.  Con
7710: 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20  sider this test 
7720: 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  case:.**.**     
7730: 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e    int fd1 = open
7740: 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44  ("./file1", O_RD
7750: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
7760: 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  );.**       int 
7770: 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd2 = open("./fi
7780: 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le2", O_RDWR|O_C
7790: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a  REAT, 0644);.**.
77a0: 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c  ** Suppose ./fil
77b0: 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61  e1 and ./file2 a
77c0: 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61  re really the sa
77d0: 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  me file (because
77e0: 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72  .** one is a har
77f0: 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69  d or symbolic li
7800: 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29  nk to the other)
7810: 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74   then if you set
7820: 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65  .** an exclusive
7830: 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68   lock on fd1, th
7840: 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e  en try to get an
7850: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
7860: 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f  ** on fd2, it wo
7870: 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61  rks.  I would ha
7880: 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20  ve expected the 
7890: 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a  second lock to.*
78a0: 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65  * fail since the
78b0: 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61  re was already a
78c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
78d0: 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a  e due to fd1..**
78e0: 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69   But not so.  Si
78f0: 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63  nce both locks c
7900: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ame from the sam
7910: 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a  e process, the.*
7920: 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64  * second overrid
7930: 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76  es the first, ev
7940: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77  en though they w
7950: 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ere on different
7960: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
7970: 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64  tors opened on d
7980: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61  ifferent file na
7990: 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  mes..**.** This 
79a0: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61  means that we ca
79b0: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c  nnot use POSIX l
79c0: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e  ocks to synchron
79d0: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a  ize file access.
79e0: 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69  ** among competi
79f0: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68  ng threads of th
7a00: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
7a10: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c   POSIX locks wil
7a20: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74  l work fine.** t
7a30: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63  o synchronize ac
7a40: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73  cess for threads
7a50: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f   in separate pro
7a60: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a  cesses, but not.
7a70: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69  ** threads withi
7a80: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
7a90: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ss..**.** To wor
7aa0: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f  k around the pro
7ab0: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73  blem, SQLite has
7ac0: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20   to manage file 
7ad0: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79  locks internally
7ae0: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20  .** on its own. 
7af0: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20   Whenever a new 
7b00: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
7b10: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  ed, we have to f
7b20: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  ind the.** speci
7b30: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65  fic inode of the
7b40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
7b50: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74  the inode is det
7b60: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a  ermined by the.*
7b70: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f  * st_dev and st_
7b80: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ino fields of th
7b90: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65  e stat structure
7ba0: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69   that fstat() fi
7bb0: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63  lls in).** and c
7bc0: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61  heck for locks a
7bd0: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20  lready existing 
7be0: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20  on that inode.  
7bf0: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  When locks are.*
7c00: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d  * created or rem
7c10: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  oved, we have to
7c20: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e   look at our own
7c30: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
7c40: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73   of the.** locks
7c50: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
7c60: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72  er thread has pr
7c70: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c  eviously set a l
7c80: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65  ock on that same
7c90: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  .** inode..**.**
7ca0: 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73 65   (Aside: The use
7cb0: 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72   of inode number
7cc0: 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73 20  s as unique IDs 
7cd0: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
7ce0: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72   VxWorks..** For
7cf0: 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76   VxWorks, we hav
7d00: 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74  e to use the alt
7d10: 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20  ernative unique 
7d20: 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20  ID system based 
7d30: 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20  on.** canonical 
7d40: 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70  filename and imp
7d50: 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20  lemented in the 
7d60: 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f  previous divisio
7d70: 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  n.).**.** The sq
7d80: 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
7d90: 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69  ture for POSIX i
7da0: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74  s no longer just
7db0: 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65   an integer file
7dc0: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20  .** descriptor. 
7dd0: 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72   It is now a str
7de0: 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64  ucture that hold
7df0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 69  s the integer fi
7e00: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
7e10: 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
7e20: 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  o a structure th
7e30: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
7e40: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63   internal.** loc
7e50: 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73  ks on the corres
7e60: 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20  ponding inode.  
7e70: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63  There is one loc
7e80: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a  king structure.*
7e90: 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20  * per inode, so 
7ea0: 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  if the same inod
7eb0: 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63  e is opened twic
7ec0: 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65  e, both unixFile
7ed0: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70   structures.** p
7ee0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65  oint to the same
7ef0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
7f00: 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  re.  The locking
7f10: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
7f20: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
7f30: 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c  count (so we wil
7f40: 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64  l know when to d
7f50: 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20  elete it) and a 
7f60: 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74  "cnt".** field t
7f70: 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73  hat tells us its
7f80: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
7f90: 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d  tatus.  cnt==0 m
7fa0: 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65  eans the.** file
7fb0: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63   is unlocked.  c
7fc0: 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65  nt==-1 means the
7fd0: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63   file has an exc
7fe0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20  lusive lock..** 
7ff0: 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72  cnt>0 means ther
8000: 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64  e are cnt shared
8010: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69   locks on the fi
8020: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74  le..**.** Any at
8030: 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72  tempt to lock or
8040: 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66   unlock a file f
8050: 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20  irst checks the 
8060: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63  locking.** struc
8070: 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c  ture.  The fcntl
8080: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69  () system call i
8090: 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74  s only invoked t
80a0: 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49  o set a .** POSI
80b0: 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e  X lock if the in
80c0: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75  ternal lock stru
80d0: 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e  cture transition
80e0: 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c  s between.** a l
80f0: 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c  ocked and an unl
8100: 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a  ocked state..**.
8110: 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74 68  ** But wait:  th
8120: 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65  ere are yet more
8130: 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50   problems with P
8140: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
8150: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f  cks..**.** If yo
8160: 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  u close a file d
8170: 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 70  escriptor that p
8180: 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20  oints to a file 
8190: 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a  that has locks,.
81a0: 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20  ** all locks on 
81b0: 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61  that file that a
81c0: 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  re owned by the 
81d0: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
81e0: 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e  are.** released.
81f0: 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
8200: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65   this problem, e
8210: 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ach unixInodeInf
8220: 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e  o object.** main
8230: 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66  tains a count of
8240: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
8250: 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ending locks on 
8260: 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68  tha inode..** Wh
8270: 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
8280: 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61   made to close a
8290: 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74  n unixFile, if t
82a0: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
82b0: 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20  r unixFile open 
82c0: 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  on the same inod
82d0: 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69  e that are holdi
82e0: 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61  ng locks, the ca
82f0: 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29  ll.** to close()
8300: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
8310: 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64  ptor is deferred
8320: 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68   until all of th
8330: 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a  e locks clear..*
8340: 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * The unixInodeI
8350: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65  nfo structure ke
8360: 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69  eps a list of fi
8370: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
8380: 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62  hat need to.** b
8390: 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61  e closed and tha
83a0: 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64  t list is walked
83b0: 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77   (and cleared) w
83c0: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
83d0: 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a  k.** clears..**.
83e0: 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70  ** Yet another p
83f0: 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68  roblem:  LinuxTh
8400: 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61  reads do not pla
8410: 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69  y well with posi
8420: 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d  x locks..**.** M
8430: 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  any older versio
8440: 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20  ns of linux use 
8450: 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73  the LinuxThreads
8460: 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20 69   library which i
8470: 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63  s.** not posix c
8480: 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72  ompliant.  Under
8490: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61   LinuxThreads, a
84a0: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
84b0: 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e   thread.** A can
84c0: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20  not be modified 
84d0: 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  or overridden by
84e0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
84f0: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74  ead B..** Only t
8500: 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69  hread A can modi
8510: 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f  fy the lock.  Lo
8520: 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69  cking behavior i
8530: 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20  s correct.** if 
8540: 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75  the appliation u
8550: 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61  ses the newer Na
8560: 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65 61  tive Posix Threa
8570: 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29  d Library (NPTL)
8580: 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77  .** on linux - w
8590: 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20  ith NPTL a lock 
85a0: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
85b0: 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65  d A can override
85c0: 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72   locks.** in thr
85d0: 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65 72  ead B.  But ther
85e0: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
85f0: 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  now at compile-t
8600: 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72  ime which.** thr
8610: 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69  eading library i
8620: 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53  s being used.  S
8630: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  o there is no wa
8640: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20  y to know at.** 
8650: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
8660: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
8670: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
8680: 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61  e locks on threa
8690: 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20  d B..** One has 
86a0: 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65  to do a run-time
86b0: 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76   check to discov
86c0: 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  er the behavior 
86d0: 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  of the.** curren
86e0: 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
86f0: 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20   SQLite used to 
8700: 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72  support LinuxThr
8710: 65 61 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f  eads.  But suppo
8720: 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65  rt for LinuxThre
8730: 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70  ads.** was dropp
8740: 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ed beginning wit
8750: 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e  h version 3.7.0.
8760: 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74    SQLite will st
8770: 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a  ill work with.**
8780: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70 72   LinuxThreads pr
8790: 6f 76 69 64 65 64 20 74 68 61 74 20 28 31 29 20  ovided that (1) 
87a0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65  there is no more
87b0: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63   than one connec
87c0: 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74  tion .** per dat
87d0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
87e0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61  e same process a
87f0: 6e 64 20 28 32 29 20 64 61 74 61 62 61 73 65 20  nd (2) database 
8800: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64  connections.** d
8810: 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73  o not move acros
8820: 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f  s threads..*/../
8830: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
8840: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8850: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
8860: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
8870: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
8880: 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69  a particular uni
8890: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
88a0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  t..*/.struct uni
88b0: 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f  xFileId {.  dev_
88c0: 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20  t dev;          
88d0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
88e0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
88f0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
8900: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
8910: 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71  d *pId;  /* Uniq
8920: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76  ue file ID for v
8930: 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65  xworks. */.#else
8940: 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20  .  ino_t ino;   
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8960: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
8970: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
8980: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
8990: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
89a0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
89b0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
89c0: 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20  open.** inode.  
89d0: 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65  Or, on LinuxThre
89e0: 61 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e  ads, there is on
89f0: 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63  e of these struc
8a00: 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63  tures for.** eac
8a10: 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62  h inode opened b
8a20: 79 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a  y each thread..*
8a30: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
8a40: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
8a50: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
8a60: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
8a70: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
8a80: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
8a90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
8aa0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
8ab0: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a  object and this.
8ac0: 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20  ** object keeps 
8ad0: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
8ae0: 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c  umber of unixFil
8af0: 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74  e pointing to it
8b00: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
8b10: 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74  InodeInfo {.  st
8b20: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
8b30: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a  fileId;       /*
8b40: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
8b50: 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64  */.  int nShared
8b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8b70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8b80: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
8b90: 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  eld */.  unsigne
8ba0: 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b  d char eFileLock
8bb0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
8bc0: 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  of SHARED_LOCK, 
8bd0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74  RESERVED_LOCK et
8be0: 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  c. */.  unsigned
8bf0: 20 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f   char bProcessLo
8c00: 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  ck;     /* An ex
8c10: 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20  clusive process 
8c20: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a  lock is held */.
8c30: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
8c60: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
8c70: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75  structure */.  u
8c80: 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
8c90: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
8ca0: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
8cb0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8cc0: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
8cd0: 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20  int nLock;      
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
8d00: 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f  standing file lo
8d10: 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  cks */.  UnixUnu
8d20: 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20  sedFd *pUnused; 
8d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
8d40: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
8d50: 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  ors to close */.
8d60: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
8d70: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
8d80: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
8d90: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
8da0: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78  bjects */.  unix
8db0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76  InodeInfo *pPrev
8dc0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  ;           /*  
8dd0: 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69    .... doubly li
8de0: 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49  nked */.#if SQLI
8df0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
8e00: 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e  G_STYLE.  unsign
8e10: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
8e20: 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72  redByte;  /* for
8e30: 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73   AFP simulated s
8e40: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65  hared lock */.#e
8e50: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ndif.#if OS_VXWO
8e60: 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  RKS.  sem_t *pSe
8e70: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
8e80: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50        /* Named P
8e90: 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a  OSIX semaphore *
8ea0: 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d  /.  char aSemNam
8eb0: 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
8ec0: 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ];  /* Name of t
8ed0: 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  hat semaphore */
8ee0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
8ef0: 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c  * A lists of all
8f00: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
8f10: 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
8f20: 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  c unixInodeInfo 
8f30: 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a  *inodeList = 0;.
8f40: 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ./*.**.** This f
8f50: 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f  unction - unixLo
8f60: 67 45 72 72 6f 72 5f 78 28 29 2c 20 69 73 20 6f  gError_x(), is o
8f70: 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20  nly ever called 
8f80: 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a  via the macro.**
8f90: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e   unixLogError().
8fa0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76  .**.** It is inv
8fb0: 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72  oked after an er
8fc0: 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e  ror occurs in an
8fd0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64   OS function and
8fe0: 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a   errno has been.
8ff0: 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20  ** set. It logs 
9000: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  a message using 
9010: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f  sqlite3_log() co
9020: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
9030: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  rent value of.**
9040: 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70   errno and, if p
9050: 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d  ossible, the hum
9060: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69  an-readable equi
9070: 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65  valent from stre
9080: 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72  rror() or.** str
9090: 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a  error_r()..**.**
90a0: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
90b0: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
90c0: 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62  e macro should b
90d0: 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  e the error code
90e0: 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65   that.** will be
90f0: 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
9100: 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45  ite (e.g. SQLITE
9110: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53  _IOERR_DELETE, S
9120: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e  QLITE_CANTOPEN).
9130: 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62   .** The two sub
9140: 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74  sequent argument
9150: 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  s should be the 
9160: 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66  name of the OS f
9170: 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  unction that.** 
9180: 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e  failed (e.g. "un
9190: 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61  link", "open") a
91a0: 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  nd the associate
91b0: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61  d file-system pa
91c0: 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a  th,.** if any..*
91d0: 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f  /.#define unixLo
91e0: 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20  gError(a,b,c)   
91f0: 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74    unixLogErrorAt
9200: 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e  Line(a,b,c,__LIN
9210: 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20  E__).static int 
9220: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
9230: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
9240: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
9250: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
9260: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
9270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
9280: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
9290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75  /* Name of OS fu
92a0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c  nction that fail
92b0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
92c0: 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
92d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
92e0: 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20  path associated 
92f0: 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20  with error */.  
9300: 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20  int iLine       
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e  /* Source line n
9330: 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f  umber where erro
9340: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b  r occurred */.){
9350: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20  .  char *zErr;  
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72     /* Message fr
9380: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
9390: 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20   equivalent */. 
93a0: 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72   int iErrno = er
93b0: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
93c0: 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c   /* Saved syscal
93d0: 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a  l error number *
93e0: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
93f0: 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73  is not a threads
9400: 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54  afe build (SQLIT
9410: 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29  E_THREADSAFE==0)
9420: 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20  , then use.  ** 
9430: 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20 66  the strerror() f
9440: 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  unction to obtai
9450: 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  n the human-read
9460: 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  able error messa
9470: 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65  ge.  ** equivale
9480: 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68  nt to errno. Oth
9490: 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72 65  erwise, use stre
94a0: 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a  rror_r()..  */ .
94b0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
94c0: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
94d0: 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52  (HAVE_STRERROR_R
94e0: 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38 30  ).  char aErr[80
94f0: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72  ];.  memset(aErr
9500: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72  , 0, sizeof(aErr
9510: 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72  ));.  zErr = aEr
9520: 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45  r;..  /* If STRE
9530: 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73  RROR_R_CHAR_P (s
9540: 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73  et by autoconf s
9550: 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45  cripts) or __USE
9560: 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c  _GNU is defined,
9570: 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
9580: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
9590: 76 69 64 65 73 20 74 68 65 20 47 4e 55 20 76 65  vides the GNU ve
95a0: 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f  rsion of strerro
95b0: 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a 2a 20  r_r() that.  ** 
95c0: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
95d0: 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
95e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72  ntaining the err
95f0: 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74  or message. That
9600: 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d   pointer .  ** m
9610: 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72  ay point to aErr
9620: 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f  [], or it may po
9630: 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74  int to some stat
9640: 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77  ic storage somew
9650: 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  here. .  ** Othe
9660: 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68  rwise, assume th
9670: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72  at the system pr
9680: 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49 58  ovides the POSIX
9690: 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a   version of .  *
96a0: 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20  * strerror_r(), 
96b0: 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72 69  which always wri
96c0: 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  tes an error mes
96d0: 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d  sage into aErr[]
96e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
96f0: 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63  he code incorrec
9700: 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61 74  tly assumes that
9710: 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49 58   it is the POSIX
9720: 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73   version that is
9730: 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c  .  ** available,
9740: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
9750: 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65  ge will often be
9760: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
9770: 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67  . Not a.  ** hug
9780: 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72  e problem. Incor
9790: 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e  rectly concludin
97a0: 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20 76  g that the GNU v
97b0: 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
97c0: 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20  ble .  ** could 
97d0: 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61 75  lead to a segfau
97e0: 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a  lt though..  */.
97f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52 45  #if defined(STRE
9800: 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c  RROR_R_CHAR_P) |
9810: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f  | defined(__USE_
9820: 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23  GNU).  zErr = .#
9830: 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f   endif.  strerro
9840: 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72  r_r(iErrno, aErr
9850: 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31  , sizeof(aErr)-1
9860: 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45  );..#elif SQLITE
9870: 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a  _THREADSAFE.  /*
9880: 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65 61   This is a threa
9890: 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74  dsafe build, but
98a0: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73   strerror_r() is
98b0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
98c0: 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a  */.  zErr = "";.
98d0: 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74  #else.  /* Non-t
98e0: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
98f0: 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e   use strerror().
9900: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72   */.  zErr = str
9910: 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23  error(iErrno);.#
9920: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
9930: 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45   errcode!=SQLITE
9940: 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61  _OK );.  if( zPa
9950: 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20  th==0 ) zPath = 
9960: 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f  "";.  sqlite3_lo
9970: 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20  g(errcode,.     
9980: 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20   "os_unix.c:%d: 
9990: 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73  (%d) %s(%s) - %s
99a0: 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20  ",.      iLine, 
99b0: 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a  iErrno, zFunc, z
99c0: 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a  Path, zErr.  );.
99d0: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64  .  return errcod
99e0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  e;.}../*.** Clos
99f0: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
9a00: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73  tor..**.** We as
9a10: 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28  sume that close(
9a20: 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  ) almost always 
9a30: 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20  works, since it 
9a40: 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20  is only in a.** 
9a50: 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63  very sick applic
9a60: 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65  ation or on a ve
9a70: 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d  ry sick platform
9a80: 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 66   that it might f
9a90: 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  ail..** If it do
9aa0: 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20  es fail, simply 
9ab0: 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65  leak the file de
9ac0: 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f  scriptor, but do
9ad0: 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f   log the.** erro
9ae0: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  r..**.** Note th
9af0: 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66  at it is not saf
9b00: 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65  e to retry close
9b10: 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20 73  () after EINTR s
9b20: 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ince the.** file
9b30: 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68   descriptor migh
9b40: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
9b50: 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e  een reused by an
9b60: 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a  other thread..**
9b70: 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65   So we don't eve
9b80: 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72  n try to recover
9b90: 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20   from an EINTR. 
9ba0: 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72   Just log the er
9bb0: 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20  ror.** and move 
9bc0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
9bd0: 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  id robust_close(
9be0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
9bf0: 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65   int h, int line
9c00: 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f  no){.  if( osClo
9c10: 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69  se(h) ){.    uni
9c20: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
9c30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
9c40: 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20  SE, "close",.   
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c      pFile ? pFil
9c70: 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69  e->zPath : 0, li
9c80: 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  neno);.  }.}../*
9c90: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69  .** Close all fi
9ca0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61  le descriptors a
9cb0: 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65  ccumuated in the
9cc0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e   unixInodeInfo->
9cd0: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
9ce0: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c   .static void cl
9cf0: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e  osePendingFds(un
9d00: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
9d10: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9d20: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
9d30: 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55  >pInode;.  UnixU
9d40: 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e  nusedFd *p;.  Un
9d50: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
9d60: 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64  t;.  for(p=pInod
9d70: 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70  e->pUnused; p; p
9d80: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
9d90: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
9da0: 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
9db0: 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f  pFile, p->fd, __
9dc0: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c  LINE__);.    sql
9dd0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
9de0: 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  }.  pInode->pUnu
9df0: 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  sed = 0;.}../*.*
9e00: 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78  * Release a unix
9e10: 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74  InodeInfo struct
9e20: 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ure previously a
9e30: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64  llocated by find
9e40: 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a  InodeInfo()..**.
9e50: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74  ** The mutex ent
9e60: 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75  ered using the u
9e70: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
9e80: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
9e90: 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68   held.** when th
9ea0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
9eb0: 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
9ec0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e 6f   void releaseIno
9ed0: 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20  deInfo(unixFile 
9ee0: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
9ef0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
9f00: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
9f10: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
9f20: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
9f30: 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f   if( ALWAYS(pIno
9f40: 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  de) ){.    pInod
9f50: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  e->nRef--;.    i
9f60: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d  f( pInode->nRef=
9f70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
9f80: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  rt( pInode->pShm
9f90: 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Node==0 );.     
9fa0: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
9fb0: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (pFile);.      i
9fc0: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76  f( pInode->pPrev
9fd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
9fe0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  rt( pInode->pPre
9ff0: 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65  v->pNext==pInode
a000: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
a010: 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  de->pPrev->pNext
a020: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
a030: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a040: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
a050: 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65  nodeList==pInode
a060: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64   );.        inod
a070: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  eList = pInode->
a080: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
a090: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
a0a0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
a0b0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
a0c0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d  ->pNext->pPrev==
a0d0: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
a0e0: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d    pInode->pNext-
a0f0: 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d  >pPrev = pInode-
a100: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a  >pPrev;.      }.
a110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
a120: 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  ee(pInode);.    
a130: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
a140: 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  iven a file desc
a150: 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74  riptor, locate t
a160: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
a170: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
a180: 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66  describes that f
a190: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
a1a0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
a1b0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  e if necessary. 
a1c0: 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
a1d0: 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e  alue might be un
a1e0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61  initialized if a
a1f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
a200: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
a210: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
a220: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
a230: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
a240: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
a250: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a260: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
a270: 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70  Return an approp
a280: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
a290: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a2a0: 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20  findInodeInfo(. 
a2b0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
a2c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a2d0: 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74  /* Unix file wit
a2e0: 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64  h file desc used
a2f0: 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   in the key */. 
a300: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a310: 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20  *ppInode        
a320: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e  /* Return the un
a330: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
a340: 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ct here */.){.  
a350: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a370: 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65  * System call re
a380: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
a390: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a3b0: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
a3c0: 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a  ptor for pFile *
a3d0: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  /.  struct unixF
a3e0: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
a3f0: 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79     /* Lookup key
a400: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f   for the unixIno
a410: 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75  deInfo */.  stru
a420: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
a430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a440: 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66  w-level file inf
a450: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  ormation */.  un
a460: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
a470: 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ode = 0;     /* 
a480: 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e  Candidate unixIn
a490: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a  odeInfo object *
a4a0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  /..  assert( uni
a4b0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
a4c0: 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65  .  /* Get low-le
a4d0: 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  vel information 
a4e0: 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74  about the file t
a4f0: 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20  hat we can used 
a500: 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61  to.  ** create a
a510: 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72   unique name for
a520: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
a530: 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b    fd = pFile->h;
a540: 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28  .  rc = osFstat(
a550: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
a560: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
a570: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
a580: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64  no = errno;.#ifd
a590: 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20  ef EOVERFLOW.   
a5a0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74   if( pFile->last
a5b0: 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57  Errno==EOVERFLOW
a5c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
a5d0: 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20  _NOLFS;.#endif. 
a5e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a5f0: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66  _IOERR;.  }..#if
a600: 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20  def __APPLE__.  
a610: 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e  /* On OS X on an
a620: 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
a630: 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  m, the inode num
a640: 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a  ber is reported.
a650: 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79    ** incorrectly
a660: 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66   for zero-size f
a670: 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65  iles.  See ticke
a680: 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72  t #3260.  To wor
a690: 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68  k.  ** around th
a6a0: 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63  is problem (we c
a6b0: 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67  onsider it a bug
a6c0: 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51   in OS X, not SQ
a6d0: 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c  Lite).  ** we al
a6e0: 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68  ways increase th
a6f0: 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31  e file size to 1
a700: 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69   by writing a si
a710: 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70  ngle byte.  ** p
a720: 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e  rior to accessin
a730: 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  g the inode numb
a740: 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74  er.  The one byt
a750: 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a  e written is.  *
a760: 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63  * an ASCII 'S' c
a770: 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61  haracter which a
a780: 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62  lso happens to b
a790: 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
a7a0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61  .  ** in the hea
a7b0: 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c  der of every SQL
a7c0: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ite database.  I
a7d0: 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74  n this way, if t
a7e0: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72  here.  ** is a r
a7f0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75  ace condition su
a800: 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  ch that another 
a810: 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61  thread has alrea
a820: 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a  dy populated.  *
a830: 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  * the first page
a840: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
a850: 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64  , no damage is d
a860: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
a870: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d  statbuf.st_size=
a880: 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73  =0 && (pFile->fs
a890: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
a8a0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29  SFLAGS_IS_MSDOS)
a8b0: 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72  !=0 ){.    do{ r
a8c0: 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20  c = osWrite(fd, 
a8d0: 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28  "S", 1); }while(
a8e0: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
a8f0: 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66 28  EINTR );.    if(
a900: 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20   rc!=1 ){.      
a910: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
a920: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
a930: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
a940: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ERR;.    }.    r
a950: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
a960: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69  &statbuf);.    i
a970: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
a980: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
a990: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
a9a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a9b0: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  IOERR;.    }.  }
a9c0: 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65  .#endif..  memse
a9d0: 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69  t(&fileId, 0, si
a9e0: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
a9f0: 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74   fileId.dev = st
aa00: 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69  atbuf.st_dev;.#i
aa10: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66  f OS_VXWORKS.  f
aa20: 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c  ileId.pId = pFil
aa30: 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  e->pId;.#else.  
aa40: 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61  fileId.ino = sta
aa50: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e  tbuf.st_ino;.#en
aa60: 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69  dif.  pInode = i
aa70: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  nodeList;.  whil
aa80: 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d  e( pInode && mem
aa90: 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49  cmp(&fileId, &pI
aaa0: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69  node->fileId, si
aab0: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b  zeof(fileId)) ){
aac0: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49  .    pInode = pI
aad0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  node->pNext;.  }
aae0: 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30  .  if( pInode==0
aaf0: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
ab00: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
ab10: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
ab20: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
ab30: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
ab40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ab50: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
ab60: 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20  mset(pInode, 0, 
ab70: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29  sizeof(*pInode))
ab80: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49  ;.    memcpy(&pI
ab90: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66  node->fileId, &f
aba0: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
abb0: 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f  leId));.    pIno
abc0: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
abd0: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20    pInode->pNext 
abe0: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
abf0: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d   pInode->pPrev =
ac00: 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64   0;.    if( inod
ac10: 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73  eList ) inodeLis
ac20: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
ac30: 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74  e;.    inodeList
ac40: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c   = pInode;.  }el
ac50: 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  se{.    pInode->
ac60: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
ac70: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b  pInode = pInode;
ac80: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ac90: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
aca0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
acb0: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
acc0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
acd0: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
ace0: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
acf0: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
ad00: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
ad10: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
ad20: 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
ad30: 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
ad40: 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
ad50: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
ad60: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
ad70: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
ad80: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
ad90: 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
ada0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
adb0: 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
adc0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
add0: 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72  t unixCheckReser
ade0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
adf0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
ae00: 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
ae10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ae20: 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
ae30: 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
ae40: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
ae50: 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
ae60: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
ae70: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
ae80: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
ae90: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
aea0: 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e  File );.  unixEn
aeb0: 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
aec0: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
aed0: 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
aee0: 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
aef0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
af00: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
af10: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
af20: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
af30: 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
af40: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
af50: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
af60: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
af70: 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  }..  /* Otherwis
af80: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
af90: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
afa0: 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  s it..  */.#ifnd
afb0: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69  ef __DJGPP__.  i
afc0: 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20  f( !reserved && 
afd0: 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  !pFile->pInode->
afe0: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a  bProcessLock ){.
aff0: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
b000: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
b010: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b020: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
b030: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
b040: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
b050: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
b060: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
b070: 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73  RLCK;.    if( os
b080: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
b090: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20  F_GETLK, &lock) 
b0a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
b0b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
b0c0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20  RESERVEDLOCK;.  
b0d0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
b0e0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
b0f0: 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63    } else if( loc
b100: 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43  k.l_type!=F_UNLC
b110: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72  K ){.      reser
b120: 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ved = 1;.    }. 
b130: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75   }.#endif.  .  u
b140: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
b150: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
b160: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
b170: 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %d (unix)\n", pF
b180: 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
b190: 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73  rved));..  *pRes
b1a0: 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
b1b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b1c0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
b1d0: 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f   set a system-lo
b1e0: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70  ck on the file p
b1f0: 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  File.  The lock 
b200: 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64  is .** described
b210: 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   by pLock..**.**
b220: 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61   If the pFile wa
b230: 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72  s opened read/wr
b240: 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78  ite from unix-ex
b250: 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c  cl, then the onl
b260: 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f  y lock.** ever o
b270: 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78  btained is an ex
b280: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e  clusive lock, an
b290: 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64  d it is obtained
b2a0: 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a   exactly once.**
b2b0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
b2c0: 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65  any lock is atte
b2d0: 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73  mpted.  All subs
b2e0: 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f  equent system lo
b2f0: 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  cking.** operati
b300: 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70  ons become no-op
b310: 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72  s.  Locking oper
b320: 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70  ations still hap
b330: 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a  pen internally,.
b340: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
b350: 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73  oordinate access
b360: 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74   between separat
b370: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
b380: 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e  ctions.** within
b390: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62   this process, b
b3a0: 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69  ut all of that i
b3b0: 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d  s handled in mem
b3c0: 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f  ory and the.** o
b3d0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
b3e0: 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69  does not partici
b3f0: 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pate..**.** This
b400: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70   function is a p
b410: 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66  ass-through to f
b420: 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66  cntl(F_SETLK) if
b430: 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a   pFile is using.
b440: 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72  ** any VFS other
b450: 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c   than "unix-excl
b460: 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73  " or if pFile is
b470: 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78   opened on "unix
b480: 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73  -excl".** and is
b490: 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a   read-only..**.*
b4a0: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
b4b0: 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63  ed if the call c
b4c0: 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73  ompletes success
b4d0: 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20  fully, or -1 if 
b4e0: 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e  a call.** to fcn
b4f0: 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74  tl() fails. In t
b500: 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20  his case, errno 
b510: 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61  is set appropria
b520: 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29  tely (by fcntl()
b530: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
b540: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e   unixFileLock(un
b550: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73  ixFile *pFile, s
b560: 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f  truct flock *pLo
b570: 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ck){.  int rc;. 
b580: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
b590: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
b5a0: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
b5b0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
b5c0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b5d0: 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66  Inode!=0 );.  if
b5e0: 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46  ( ((pFile->ctrlF
b5f0: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
b600: 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f  EXCL)!=0 || pIno
b610: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
b620: 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65 2d  ).   && ((pFile-
b630: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
b640: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30  XFILE_RDONLY)==0
b650: 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ).  ){.    if( p
b660: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
b670: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
b680: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
b690: 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
b6a0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
b6b0: 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 );.      lock.
b6c0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b6d0: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
b6e0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
b6f0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f  _FIRST;.      lo
b700: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
b710: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f  D_SIZE;.      lo
b720: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
b730: 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  LCK;.      rc = 
b740: 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  osFcntl(pFile->h
b750: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
b760: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c  );.      if( rc<
b770: 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
b780: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72       pInode->bPr
b790: 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20  ocessLock = 1;. 
b7a0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
b7b0: 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ck++;.    }else{
b7c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
b7d0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
b7e0: 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70    rc = osFcntl(p
b7f0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
b800: 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20  , pLock);.  }.  
b810: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b820: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
b830: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
b840: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
b850: 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
b860: 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
b870: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
b880: 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
b890: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
b8a0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
b8b0: 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
b8c0: 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
b8d0: 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
b8e0: 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
b8f0: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
b900: 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
b910: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
b920: 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
b930: 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
b940: 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
b950: 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
b960: 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
b970: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
b980: 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
b990: 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
b9a0: 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
b9b0: 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
b9c0: 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
b9d0: 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
b9e0: 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
b9f0: 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
ba00: 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
ba10: 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
ba20: 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
ba30: 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
ba40: 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
ba50: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
ba60: 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
ba70: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
ba80: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
ba90: 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
baa0: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
bab0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
bac0: 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
bad0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bae0: 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
baf0: 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
bb00: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
bb10: 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
bb20: 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
bb30: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
bb40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
bb50: 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  xLock(sqlite3_fi
bb60: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
bb70: 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65  eLock){.  /* The
bb80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72   following descr
bb90: 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ibes the impleme
bba0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ntation of the v
bbb0: 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64  arious locks and
bbc0: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73  .  ** lock trans
bbd0: 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20  itions in terms 
bbe0: 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76  of the POSIX adv
bbf0: 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64  isory shared and
bc00: 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20   exclusive.  ** 
bc10: 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20  lock primitives 
bc20: 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63  (called read-loc
bc30: 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63  ks and write-loc
bc40: 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f  ks below, to avo
bc50: 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f  id.  ** confusio
bc60: 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f  n with SQLite lo
bc70: 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61  ck names). The a
bc80: 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f  lgorithms are co
bc90: 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73  mplicated.  ** s
bca0: 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72  lightly in order
bcb0: 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c   to be compatibl
bcc0: 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73  e with windows s
bcd0: 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65  ystems simultane
bce0: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73  ously.  ** acces
bcf0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
bd00: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20  tabase file, in 
bd10: 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65  case that is eve
bd20: 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a  r required..  **
bd30: 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65  .  ** Symbols de
bd40: 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e  fined in os.h in
bd50: 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e  dentify the 'pen
bd60: 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74  ding byte' and t
bd70: 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a  he 'reserved.  *
bd80: 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69  * byte', each si
bd90: 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65  ngle bytes at we
bda0: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73  ll known offsets
bdb0: 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65  , and the 'share
bdc0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
bdd0: 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35  e', a range of 5
bde0: 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65  10 bytes at a we
bdf0: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e  ll known offset.
be00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62  .  **.  ** To ob
be10: 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
be20: 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ck, a read-lock 
be30: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
be40: 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  he 'pending.  **
be50: 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73   byte'.  If this
be60: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
be70: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
be80: 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62  om the 'shared b
be90: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
bea0: 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61  is read-locked a
beb0: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
bec0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
bed0: 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a  ' released..  **
bee0: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
bef0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
bf00: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
bf10: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
bf20: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
bf30: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
bf40: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
bf50: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
bf60: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
bf70: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
bf80: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
bf90: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
bfa0: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
bfb0: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
bfc0: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
bfd0: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
bfe0: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
bff0: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
c000: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
c010: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
c020: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
c030: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
c040: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
c050: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
c060: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
c070: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
c080: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
c090: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
c0a0: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
c0b0: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
c0c0: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
c0d0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
c0e0: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
c0f0: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
c100: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
c110: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
c120: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
c130: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
c140: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
c150: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
c160: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
c170: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
c180: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
c190: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
c1a0: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
c1b0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
c1c0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
c1d0: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
c1e0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
c1f0: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
c200: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
c210: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
c220: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
c230: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
c240: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
c250: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
c260: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
c270: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
c280: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a   database. .  **
c290: 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e  .  ** The reason
c2a0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63   a single byte c
c2b0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e  annot be used in
c2c0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68  stead of the 'sh
c2d0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
c2e0: 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f  ange' is that so
c2f0: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77  me versions of w
c300: 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75  indows do not su
c310: 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73  pport read-locks
c320: 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e  . By.  ** lockin
c330: 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  g a random byte 
c340: 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f  from a range, co
c350: 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20  ncurrent SHARED 
c360: 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a  locks may exist.
c370: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65    ** even if the
c380: 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
c390: 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79  ve used is alway
c3a0: 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a  s a write-lock..
c3b0: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20    */.  int rc = 
c3c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
c3d0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
c3e0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
c3f0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
c400: 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20  Inode;.  struct 
c410: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
c420: 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20  t tErrno = 0;.. 
c430: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
c440: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
c450: 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
c460: 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
c470: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
c480: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69  e->h,.      azFi
c490: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
c4a0: 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
c4b0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
c4c0: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
c4d0: 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  k(pFile->pInode-
c4e0: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69  >eFileLock), pFi
c4f0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
c500: 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29 29  red , getpid()))
c510: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
c520: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
c530: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
c540: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
c550: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
c560: 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
c570: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
c580: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
c590: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
c5a0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
c5b0: 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
c5c0: 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
c5d0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
c5e0: 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b  eLock>=eFileLock
c5f0: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
c600: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
c610: 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
c620: 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  ) (unix)\n", pFi
c630: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
c640: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
c650: 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
c660: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c670: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
c680: 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
c690: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
c6a0: 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29  rrect..  **  (1)
c6b0: 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66   We never move f
c6c0: 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
c6d0: 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20  anything higher 
c6e0: 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b  than shared lock
c6f0: 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69  ..  **  (2) SQLi
c700: 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69  te never explici
c710: 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70  tly requests a p
c720: 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  endig lock..  **
c730: 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c    (3) A shared l
c740: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65  ock is always he
c750: 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76  ld when a reserv
c760: 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e lock is reques
c770: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
c780: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
c790: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
c7a0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
c7b0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
c7c0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
c7d0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
c7e0: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
c7f0: 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock!=RESERVED_LO
c800: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69  CK || pFile->eFi
c810: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
c820: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
c830: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
c840: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
c850: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
c860: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
c870: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
c880: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
c890: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
c8a0: 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  de;..  /* If som
c8b0: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
c8c0: 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
c8d0: 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
c8e0: 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
c8f0: 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
c900: 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
c910: 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
c920: 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
c930: 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  if( (pFile->eFil
c940: 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65  eLock!=pInode->e
c950: 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20  FileLock && .   
c960: 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
c970: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
c980: 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
c990: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
c9a0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  )).  ){.    rc =
c9b0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
c9c0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
c9d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
c9e0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
c9f0: 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
ca00: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
ca10: 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
ca20: 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
ca30: 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
ca40: 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
ca50: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
ca60: 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
ca70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
ca80: 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
ca90: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
caa0: 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e  K && .      (pIn
cab0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
cac0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
cad0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
cae0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
caf0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
cb00: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
cb10: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
cb20: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
cb30: 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
cb40: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
cb50: 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20  >nShared>0 );.  
cb60: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
cb70: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
cb80: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
cb90: 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e  hared++;.    pIn
cba0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
cbb0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
cbc0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45  .  }...  /* A PE
cbd0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
cbe0: 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
cbf0: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
cc00: 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
cc10: 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
cc20: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
cc30: 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
cc40: 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
cc50: 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
cc60: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
cc70: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
cc80: 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63  ;.  lock.l_whenc
cc90: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
cca0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
ccb0: 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
ccc0: 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
ccd0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
cce0: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
ccf0: 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
cd00: 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e  ).  ){.    lock.
cd10: 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c  l_type = (eFileL
cd20: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
cd30: 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b  ?F_RDLCK:F_WRLCK
cd40: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  );.    lock.l_st
cd50: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
cd60: 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  TE;.    if( unix
cd70: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
cd80: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
cd90: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
cda0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cdb0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
cdc0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
cdd0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
cde0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
cdf0: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
ce00: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
ce10: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
ce20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
ce30: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
ce40: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49    }.  }...  /* I
ce50: 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
ce60: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
ce70: 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
ce80: 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
ce90: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
cea0: 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
ceb0: 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
cec0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
ced0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
cee0: 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
cef0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
cf00: 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
cf10: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
cf20: 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
cf30: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
cf40: 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f  ITE_OK );..    /
cf50: 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65  * Now get the re
cf60: 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  ad-lock */.    l
cf70: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
cf80: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
cf90: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
cfa0: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66  RED_SIZE;.    if
cfb0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
cfc0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
cfd0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
cfe0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
cff0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
d000: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
d010: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
d020: 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  LOCK);.    }..  
d030: 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
d040: 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
d050: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
d060: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
d070: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
d080: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
d090: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d0a0: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_UNLCK;.    if(
d0b0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
d0c0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72  ile, &lock) && r
d0d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d0e0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
d0f0: 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20  uld happen with 
d100: 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20  a network mount 
d110: 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  */.      tErrno 
d120: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d130: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
d140: 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a  _UNLOCK; .    }.
d150: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
d160: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
d170: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
d180: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
d190: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
d1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
d1b0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
d1c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
d1d0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
d1e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
d1f0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
d200: 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
d210: 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
d220: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
d230: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
d240: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
d250: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
d260: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
d270: 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
d280: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
d290: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
d2a0: 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   in this.    ** 
d2b0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
d2c0: 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
d2d0: 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
d2e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d2f0: 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
d300: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
d310: 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
d320: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
d330: 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
d340: 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
d350: 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
d360: 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
d370: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
d380: 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
d390: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
d3a0: 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46  rt( 0!=pFile->eF
d3b0: 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c  ileLock );.    l
d3c0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
d3d0: 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72  RLCK;..    asser
d3e0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  t( eFileLock==RE
d3f0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
d400: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
d410: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
d420: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  if( eFileLock==R
d430: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
d440: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
d450: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
d460: 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  TE;.      lock.l
d470: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d  _len = 1L;.    }
d480: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  else{.      lock
d490: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
d4a0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
d4b0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
d4c0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a  ED_SIZE;.    }..
d4d0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
d4e0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
d4f0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  k) ){.      tErr
d500: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
d510: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
d520: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
d530: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
d540: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
d550: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d560: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
d570: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d580: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
d590: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
d5a0: 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   ..#ifdef SQLITE
d5b0: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20  _DEBUG.  /* Set 
d5c0: 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
d5d0: 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67  on-counter chang
d5e0: 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73  e checking flags
d5f0: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73   when.  ** trans
d600: 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20  itioning from a 
d610: 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45  SHARED to a RESE
d620: 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20  RVED lock.  The 
d630: 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d  change.  ** from
d640: 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
d650: 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65  VED marks the be
d660: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72  ginning of a nor
d670: 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f  mal.  ** write o
d680: 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20  peration (not a 
d690: 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot journal roll
d6a0: 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  back)..  */.  if
d6b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
d6c0: 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69     && pFile->eFi
d6d0: 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
d6e0: 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c  OCK.   && eFileL
d6f0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
d700: 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c  CK.  ){.    pFil
d710: 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
d720: 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
d730: 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
d740: 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
d750: 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d  alWrite = 1;.  }
d760: 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20  .#endif...  if( 
d770: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d780: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
d790: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
d7a0: 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
d7b0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
d7c0: 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
d7d0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
d7e0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
d7f0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
d800: 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
d810: 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
d820: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
d830: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65  ING_LOCK;.  }..e
d840: 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
d850: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
d860: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
d870: 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29   %d %s %s (unix)
d880: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
d890: 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
d8a0: 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ock), .      rc=
d8b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
d8c0: 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
d8d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d8e0: 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69  /*.** Add the fi
d8f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73  le descriptor us
d900: 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c  ed by file handl
d910: 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63  e pFile to the c
d920: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
d930: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
d940: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
d950: 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69  PendingFd(unixFi
d960: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
d970: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
d980: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
d990: 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
d9a0: 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e  dFd *p = pFile->
d9b0: 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e  pUnused;.  p->pN
d9c0: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55  ext = pInode->pU
d9d0: 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d  nused;.  pInode-
d9e0: 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20  >pUnused = p;.  
d9f0: 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
da00: 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20   pFile->pUnused 
da10: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  = 0;.}../*.** Lo
da20: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
da30: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
da40: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
da50: 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
da60: 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
da70: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
da80: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
da90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
daa0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
dab0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
dac0: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
dad0: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
dae0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
daf0: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
db00: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
db10: 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61  op..** .** If ha
db20: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73  ndleNFSUnlock is
db30: 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64   true, then on d
db40: 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58  owngrading an EX
db50: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20  CLUSIVE_LOCK to 
db60: 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79  SHARED.** the by
db70: 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69  te range is divi
db80: 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73  ded into 2 parts
db90: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70   and the first p
dba0: 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  art is unlocked 
dbb0: 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61  then.** set to a
dbc0: 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e   read lock, then
dbd0: 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 20   the other part 
dbe0: 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b  is simply unlock
dbf0: 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ed.  This works 
dc00: 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67  .** around a bug
dc10: 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b   in BSD NFS lock
dc20: 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20  d (also seen on 
dc30: 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68  MacOSX 10.3+) th
dc40: 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20  at fails to .** 
dc50: 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65  remove the write
dc60: 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f   lock on a regio
dc70: 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  n when a read lo
dc80: 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74  ck is set..*/.st
dc90: 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e  atic int posixUn
dca0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
dcb0: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
dcc0: 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65  Lock, int handle
dcd0: 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e  NFSUnlock){.  un
dce0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
dcf0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
dd00: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
dd10: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
dd20: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
dd30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
dd40: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  K;..  assert( pF
dd50: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
dd60: 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
dd70: 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
dd80: 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
dd90: 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
dda0: 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c  Lock,.      pFil
ddb0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
ddc0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
ddd0: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
dde0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
ddf0: 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29        getpid()))
de00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  ;..  assert( eFi
de10: 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
de20: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69  OCK );.  if( pFi
de30: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65  le->eFileLock<=e
de40: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
de50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
de60: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
de70: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
de80: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
de90: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  de;.  assert( pI
dea0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30  node->nShared!=0
deb0: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
dec0: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
ded0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
dee0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
def0: 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e  ileLock==pFile->
df00: 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69  eFileLock );..#i
df10: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
df20: 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
df30: 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
df40: 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
df50: 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
df60: 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
df70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
df80: 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
df90: 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
dfa0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
dfb0: 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
dfc0: 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
dfd0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
dfe0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
dff0: 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
e000: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
e010: 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
e020: 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
e030: 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
e040: 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
e050: 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
e060: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
e070: 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
e080: 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
e090: 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
e0a0: 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
e0b0: 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
e0c0: 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
e0d0: 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
e0e0: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
e0f0: 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d     */.    pFile-
e100: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
e110: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
e120: 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74  /* downgrading t
e130: 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
e140: 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20  on NFS involves 
e150: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69  clearing the wri
e160: 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62  te lock.    ** b
e170: 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69  efore establishi
e180: 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20  ng the readlock 
e190: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63  - to avoid a rac
e1a0: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64  e condition we d
e1b0: 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20  owngrade.    ** 
e1c0: 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c  the lock in 2 bl
e1d0: 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61  ocks, so that pa
e1e0: 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  rt of the range 
e1f0: 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20  will be covered 
e200: 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69  by a .    ** wri
e210: 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68  te lock until th
e220: 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65  e rest is covere
e230: 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b  d by a read lock
e240: 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b  :.    **  1:   [
e250: 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32  WWWWW].    **  2
e260: 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20  :   [....W].    
e270: 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d  **  3:   [RRRRW]
e280: 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52  .    **  4:   [R
e290: 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20  RRR.].    */.   
e2a0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
e2b0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a  SHARED_LOCK ){..
e2c0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41  #if !defined(__A
e2d0: 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49  PPLE__) || !SQLI
e2e0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
e2f0: 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76  G_STYLE.      (v
e300: 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  oid)handleNFSUnl
e310: 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ock;.      asser
e320: 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  t( handleNFSUnlo
e330: 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ck==0 );.#endif.
e340: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
e350: 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
e360: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
e370: 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20  STYLE.      if( 
e380: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
e390: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  ){.        int t
e3a0: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
e3b0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
e3c0: 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63  de from system c
e3d0: 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  all errors */.  
e3e0: 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53        off_t divS
e3f0: 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  ize = SHARED_SIZ
e400: 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a  E - 1;.        .
e410: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
e420: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
e430: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
e440: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
e450: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e460: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
e470: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
e480: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
e490: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
e4a0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
e4b0: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
e4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
e4d0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e4e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e4f0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
e500: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e510: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
e520: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
e530: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e540: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
e550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e560: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
e570: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e580: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
e590: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
e5a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e5b0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e5c0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
e5d0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
e5e0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
e5f0: 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
e600: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
e610: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
e620: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
e630: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
e640: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e650: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e660: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
e670: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
e680: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
e690: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e6a0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
e6b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
e6c0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e6d0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
e6e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e6f0: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
e700: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e710: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
e720: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
e730: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e740: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e750: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
e760: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
e770: 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  T+divSize;.     
e780: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e790: 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53  SHARED_SIZE-divS
e7a0: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
e7b0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e7c0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
e7d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
e7e0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
e7f0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
e800: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
e810: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
e820: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
e830: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
e840: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
e850: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
e860: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e870: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
e880: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
e890: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
e8a0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
e8b0: 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
e8c0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
e8d0: 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b  STYLE */.      {
e8e0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e8f0: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
e900: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
e910: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
e920: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
e930: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
e940: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
e950: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
e960: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  ED_SIZE;.       
e970: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
e980: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
e990: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
e9a0: 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
e9b0: 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c  all to unixFileL
e9c0: 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  ock() cannot fai
e9d0: 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65  l because anothe
e9e0: 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  r.          ** p
e9f0: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
ea00: 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  g an incompatibl
ea10: 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f  e lock. If it do
ea20: 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20  es, this .      
ea30: 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73      ** indicates
ea40: 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
ea50: 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
ea60: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63  ollowing the loc
ea70: 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  king.          *
ea80: 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74  * protocol. If t
ea90: 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74  his happens, ret
eaa0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
eab0: 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69  _RDLOCK. Returni
eac0: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
ead0: 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c  SQLITE_BUSY woul
eae0: 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70  d confuse the up
eaf0: 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72  per layer (in pr
eb00: 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73  actice it causes
eb10: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
eb20: 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c  n assert to fail
eb30: 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20  ). */ .         
eb40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
eb50: 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_RDLOCK;.     
eb60: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
eb70: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
eb80: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
eb90: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
eba0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ebb0: 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  }.    lock.l_typ
ebc0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
ebd0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
ebe0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
ebf0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
ec00: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
ec10: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b  lock.l_len = 2L;
ec20: 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e    assert( PENDIN
ec30: 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56  G_BYTE+1==RESERV
ec40: 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69  ED_BYTE );.    i
ec50: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
ec60: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30  pFile, &lock)==0
ec70: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
ec80: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
ec90: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
eca0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
ecb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
ecc0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
ecd0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
ece0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rrno;.      goto
ecf0: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
ed00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69   }.  }.  if( eFi
ed10: 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
ed20: 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  ){.    /* Decrem
ed30: 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
ed40: 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
ed50: 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
ed60: 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
ed70: 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
ed80: 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
ed90: 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
eda0: 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
edb0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
edc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
edd0: 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
ede0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
edf0: 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
ee00: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
ee10: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
ee20: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
ee30: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
ee40: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c  lock.l_start = l
ee50: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a  ock.l_len = 0L;.
ee60: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
ee70: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
ee80: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
ee90: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
eea0: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
eeb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
eec0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
eed0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
eee0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
eef0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
ef00: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
ef10: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
ef20: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
ef30: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
ef40: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
ef50: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ef60: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
ef70: 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61  unt of locks aga
ef80: 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66  inst this same f
ef90: 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20  ile.  When the. 
efa0: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63     ** count reac
efb0: 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20  hes zero, close 
efc0: 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64  any other file d
efd0: 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65  escriptors whose
efe0: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61   close.    ** wa
eff0: 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75  s deferred becau
f000: 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  se of outstandin
f010: 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a  g locks..    */.
f020: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
f030: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
f040: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
f050: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
f060: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
f070: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
f080: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
f090: 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e     }.  }..end_un
f0a0: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
f0b0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
f0c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
f0d0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f0e0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
f0f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f100: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
f110: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
f120: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
f130: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
f140: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
f150: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
f160: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
f170: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
f180: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
f190: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
f1a0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
f1b0: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
f1c0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
f1d0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
f1e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
f1f0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
f200: 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
f210: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f220: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
f230: 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f  ck){.  return po
f240: 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
f250: 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a  ileLock, 0);.}..
f260: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f270: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
f280: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
f290: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
f2a0: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
f2b0: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
f2c0: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
f2d0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
f2e0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
f2f0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
f300: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
f310: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
f320: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
f330: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
f340: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
f350: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
f360: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
f370: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
f380: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
f390: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
f3a0: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
f3b0: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
f3c0: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
f3d0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
f3e0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
f3f0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
f400: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
f410: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
f420: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
f430: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
f440: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
f450: 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63   ){.    robust_c
f460: 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c  lose(pFile, pFil
f470: 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e->h, __LINE__);
f480: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  .    pFile->h = 
f490: 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56  -1;.  }.#if OS_V
f4a0: 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69  XWORKS.  if( pFi
f4b0: 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69  le->pId ){.    i
f4c0: 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
f4d0: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
f4e0: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f  ELETE ){.      o
f4f0: 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70  sUnlink(pFile->p
f500: 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
f510: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76  me);.    }.    v
f520: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
f530: 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b  eId(pFile->pId);
f540: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20  .    pFile->pId 
f550: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
f560: 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
f570: 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69  E   %-3d\n", pFi
f580: 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43  le->h));.  OpenC
f590: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71  ounter(-1);.  sq
f5a0: 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
f5b0: 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65  ->pUnused);.  me
f5c0: 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
f5d0: 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
f5e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f5f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
f600: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
f610: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
f620: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
f630: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63  e *id){.  int rc
f640: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f650: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f660: 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
f670: 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69  ;.  unixUnlock(i
f680: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75  d, NO_LOCK);.  u
f690: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
f6a0: 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e  ..  /* unixFile.
f6b0: 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  pInode is always
f6c0: 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68   valid here. Oth
f6d0: 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72  erwise, a differ
f6e0: 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72  ent close.  ** r
f6f0: 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c  outine (e.g. nol
f700: 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c  ockClose()) woul
f710: 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  d be called inst
f720: 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ead..  */.  asse
f730: 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
f740: 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46  e->nLock>0 || pF
f750: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
f760: 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
f770: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46 69    if( ALWAYS(pFi
f780: 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70  le->pInode) && p
f790: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
f7a0: 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ock ){.    /* If
f7b0: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
f7c0: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
f7d0: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
f7e0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
f7f0: 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63  t.    ** yet bec
f800: 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
f810: 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
f820: 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
f830: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
f840: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
f850: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c  Inode->pUnused l
f860: 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ist.  It will be
f870: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
f880: 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68  losed .    ** wh
f890: 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
f8a0: 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
f8b0: 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69   */.    setPendi
f8c0: 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d  ngFd(pFile);.  }
f8d0: 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  .  releaseInodeI
f8e0: 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63  nfo(pFile);.  rc
f8f0: 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
f900: 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  (id);.  unixLeav
f910: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
f920: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  rn rc;.}../*****
f930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
f940: 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   the posix advis
f950: 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ory lock impleme
f960: 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
f970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
f980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9c0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
f9d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
fa20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20  ********* No-op 
fa40: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
fa50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
fa70: 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   Of the various 
fa80: 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
fa90: 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c  tations availabl
faa0: 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61  e, this is by fa
fab0: 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73  r the.** simples
fac0: 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69  t:  locking is i
fad0: 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65  gnored.  No atte
fae0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c  mpt is made to l
faf0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
fb00: 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61  .** file for rea
fb10: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e  ding or writing.
fb20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b  .**.** This lock
fb30: 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72  ing mode is appr
fb40: 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20  opriate for use 
fb50: 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74  on read-only dat
fb60: 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64  abases.** (ex: d
fb70: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72  atabases that ar
fb80: 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44  e burned into CD
fb90: 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  -ROM, for exampl
fba0: 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61  e.)  It can.** a
fbb0: 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74  lso be used if t
fbc0: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65  he application e
fbd0: 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65  mploys some exte
fbe0: 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74  rnal mechanism t
fbf0: 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d  o.** prevent sim
fc00: 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73  ultaneous access
fc10: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74   of the same dat
fc20: 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20  abase by two or 
fc30: 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  more.** database
fc40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42   connections.  B
fc50: 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65  ut there is a se
fc60: 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61  rious risk of da
fc70: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70  tabase.** corrup
fc80: 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63  tion if this loc
fc90: 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  king mode is use
fca0: 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20  d in situations 
fcb0: 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a  where multiple.*
fcc0: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
fcd0: 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73  ctions are acces
fce0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
fcf0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
fd00: 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20  he same.** time 
fd10: 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  and one or more 
fd20: 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
fd30: 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67  ions are writing
fd40: 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
fd50: 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
fd60: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
fd70: 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
fd80: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
fd90: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
fda0: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70  R(NotUsed);.  *p
fdb0: 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65  ResOut = 0;.  re
fdc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fdd0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
fde0: 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
fdf0: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
fe00: 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
fe10: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
fe20: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
fe30: 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
fe40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
fe50: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c  ic int nolockUnl
fe60: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
fe70: 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
fe80: 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
fe90: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
fea0: 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
feb0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
fec0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
fed0: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a  lose the file..*
fee0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  /.static int nol
fef0: 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
ff00: 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72  _file *id) {.  r
ff10: 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46  eturn closeUnixF
ff20: 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a  ile(id);.}../***
ff30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff40: 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f   End of the no-o
ff50: 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  p lock implement
ff60: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
ff70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
ff80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
ffd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10030 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74  ****** Begin dot
10040 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  -file Locking **
10050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
10070 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c  ** The dotfile l
10080 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
10090 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65  ation uses the e
100a0 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61  xistance of sepa
100b0 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c  rate lock.** fil
100c0 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72  es (really a dir
100d0 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72  ectory) to contr
100e0 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ol access to the
100f0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
10100 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73   works.** on jus
10110 74 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69  t about every fi
10120 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61  lesystem imagina
10130 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20  ble.  But there 
10140 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e  are serious down
10150 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  sides:.**.**    
10160 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65  (1)  There is ze
10170 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20  ro concurrency. 
10180 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72   A single reader
10190 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65   blocks all othe
101a0 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e  r.**         con
101b0 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65  nections from re
101c0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
101d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
101e0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20  *.**    (2)  An 
101f0 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73  application cras
10200 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20  h or power loss 
10210 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20  can leave stale 
10220 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20  lock files.**   
10230 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72        sitting ar
10240 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74  ound that need t
10250 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e  o be cleared man
10260 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76  ually..**.** Nev
10270 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74  ertheless, a dot
10280 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f  lock is an appro
10290 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
102a0 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e  ode for use if n
102b0 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69  o.** other locki
102c0 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61  ng strategy is a
102d0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
102e0 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
102f0 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e  works by creatin
10300 67 20 61 20 73 75 62 64 69 72 65 63 74 6f 72 79  g a subdirectory
10310 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
10320 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65  ectory as.** the
10330 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69   database and wi
10340 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
10350 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f   but with a ".lo
10360 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64  ck" extension ad
10370 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73  ded..** The exis
10380 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20  tance of a lock 
10390 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69 65  directory implie
103a0 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
103b0 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a  ock.  All other.
103c0 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28 53  ** lock types (S
103d0 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
103e0 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61   PENDING) are ma
103f0 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53  pped into EXCLUS
10400 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  IVE..*/../*.** T
10410 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61  he file suffix a
10420 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  dded to the data
10430 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69   base filename i
10440 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
10450 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69  e the.** lock di
10460 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66  rectory..*/.#def
10470 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  ine DOTLOCK_SUFF
10480 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a  IX ".lock"../*.*
10490 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
104a0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
104b0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
104c0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
104d0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
104e0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
104f0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
10500 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
10510 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
10520 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
10530 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
10540 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
10550 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
10560 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
10570 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
10580 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
10590 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
105a0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
105b0 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  cking..**.** In 
105c0 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
105d0 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65   either a lock e
105e0 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73  xists or it does
105f0 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69   not.  So in thi
10600 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f  s.** variation o
10610 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  f CheckReservedL
10620 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20  ock(), *pResOut 
10630 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
10640 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f any lock.** is
10650 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
10660 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  e and false if t
10670 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
10680 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
10690 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  nt dotlockCheckR
106a0 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
106b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
106c0 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
106d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
106e0 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
106f0 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
10700 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10710 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
10720 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
10730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
10740 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
10750 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
10760 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
10770 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
10780 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
10790 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
107a0 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
107b0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
107c0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
107d0 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
107e0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
107f0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  or some other co
10800 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nnection in the 
10810 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20  same process.   
10820 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b   ** holds a lock
10830 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e   on the file.  N
10840 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
10850 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  further. */.    
10860 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
10870 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
10880 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69  e lock is held i
10890 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68  f and only if th
108a0 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74  e lockfile exist
108b0 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  s */.    const c
108c0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
108d0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46   (const char*)pF
108e0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
108f0 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65  ext;.    reserve
10900 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f  d = osAccess(zLo
10910 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20  ckFile, 0)==0;. 
10920 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
10930 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
10940 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d %d (dotlock)\n
10950 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
10960 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a   reserved));.  *
10970 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
10980 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
10990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
109a0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
109b0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
109c0 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
109d0 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
109e0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
109f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
10a00 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
10a10 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
10a20 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
10a30 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
10a40 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
10a50 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
10a60 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
10a70 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
10a80 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
10a90 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
10aa0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
10ab0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
10ac0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
10ad0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
10ae0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
10af0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
10b00 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
10b10 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
10b20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
10b30 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
10b40 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
10b50 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
10b60 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
10b70 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
10b80 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
10b90 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
10ba0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
10bb0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
10bc0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
10bd0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
10be0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
10bf0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
10c00 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
10c10 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
10c20 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
10c30 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
10c40 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
10c50 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
10c60 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
10c70 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
10c80 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
10c90 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
10ca0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
10cb0 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
10cc0 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
10cd0 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
10ce0 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
10cf0 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
10d00 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
10d10 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
10d20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
10d30 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
10d40 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
10d50 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
10d60 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
10d70 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
10d80 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
10d90 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
10da0 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
10db0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
10dc0 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  text;.  int rc =
10dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20   SQLITE_OK;...  
10de0 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e  /* If we have an
10df0 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  y lock, then the
10e00 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61   lock file alrea
10e10 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20  dy exists.  All 
10e20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
10e30 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72  do is adjust our
10e40 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
10e50 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76   of the lock lev
10e60 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  el..  */.  if( p
10e70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
10e80 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  > NO_LOCK ){.   
10e90 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
10ea0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
10eb0 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64     /* Always upd
10ec0 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  ate the timestam
10ed0 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c  p on the old fil
10ee0 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45  e */.#ifdef HAVE
10ef0 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65  _UTIME.    utime
10f00 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c  (zLockFile, NULL
10f10 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69  );.#else.    uti
10f20 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  mes(zLockFile, N
10f30 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ULL);.#endif.   
10f40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10f50 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
10f60 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
10f70 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20   lock */.  rc = 
10f80 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osMkdir(zLockFil
10f90 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20  e, 0777);.  if( 
10fa0 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66  rc<0 ){.    /* f
10fb0 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72  ailed to open/cr
10fc0 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69  eate the lock di
10fd0 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69  rectory */.    i
10fe0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
10ff0 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53  o;.    if( EEXIS
11000 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T == tErrno ){. 
11010 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11020 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73  _BUSY;.    } els
11030 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e {.      rc = s
11040 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
11050 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
11060 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
11070 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
11080 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
11090 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
110a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
110b0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
110c0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
110d0 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a  rc;.  } .  .  /*
110e0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
110f0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
11100 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
11110 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
11120 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
11130 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
11140 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
11150 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
11160 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
11170 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
11180 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
11190 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
111a0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
111b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
111c0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
111d0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
111e0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
111f0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
11200 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
11210 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
11220 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
11230 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  p..**.** When th
11240 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11250 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c  reaches NO_LOCK,
11260 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
11270 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
11280 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f   int dotlockUnlo
11290 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
112a0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
112b0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
112c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
112d0 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
112e0 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
112f0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
11300 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
11310 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
11320 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
11330 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
11340 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
11350 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20  d (dotlock)\n", 
11360 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
11370 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
11380 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11390 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
113a0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
113b0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
113c0 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
113d0 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
113e0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
113f0 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
11400 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11410 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
11420 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65   /* To downgrade
11430 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70   to shared, simp
11440 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  ly update our in
11450 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66  ternal notion of
11460 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73   the.  ** lock s
11470 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74  tate.  No need t
11480 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20  o mess with the 
11490 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
114a0 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
114b0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
114c0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
114d0 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
114e0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
114f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11500 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c  .  .  /* To full
11510 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  y unlock the dat
11520 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68  abase, delete th
11530 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  e lock file */. 
11540 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
11550 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  ck==NO_LOCK );. 
11560 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c   rc = osRmdir(zL
11570 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ockFile);.  if( 
11580 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
11590 4e 4f 54 44 49 52 20 29 20 72 63 20 3d 20 6f 73  NOTDIR ) rc = os
115a0 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65  Unlink(zLockFile
115b0 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b  );.  if( rc<0 ){
115c0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
115d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
115e0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f  = 0;.    if( ENO
115f0 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  ENT != tErrno ){
11600 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
11610 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
11620 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
11630 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
11640 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
11650 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
11660 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
11670 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
11680 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11690 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
116a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
116b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
116c0 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75  a file.  Make su
116d0 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  re the lock has 
116e0 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65  been released be
116f0 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f  fore closing..*/
11700 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11710 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
11720 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
11730 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11740 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
11750 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
11760 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11770 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55  id;.    dotlockU
11780 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
11790 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  K);.    sqlite3_
117a0 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
117b0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ingContext);.   
117c0 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
117d0 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72  ile(id);.  }.  r
117e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a  eturn rc;.}./***
117f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11800 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66  End of the dot-f
11810 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ile lock impleme
11820 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
11830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
11840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
11890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
118e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118f0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c  ******* Begin fl
11900 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ock Locking ****
11910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
11930 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b  ** Use the flock
11940 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  () system call t
11950 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o do file lockin
11960 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  g..**.** flock()
11970 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
11980 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e   dot-file lockin
11990 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61  g in that the va
119a0 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72  rious.** fine-gr
119b0 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ain locking leve
119c0 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ls supported by 
119d0 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61  SQLite are colla
119e0 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  psed into.** a s
119f0 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20  ingle exclusive 
11a00 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  lock.  In other 
11a10 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52  words, SHARED, R
11a20 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20  ESERVED, and.** 
11a30 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72  PENDING locks ar
11a40 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  e the same thing
11a50 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45   as an EXCLUSIVE
11a60 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a   lock.  SQLite.*
11a70 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68  * still works wh
11a80 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20  en you do this, 
11a90 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20  but concurrency 
11aa0 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65  is reduced since
11ab0 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  .** only a singl
11ac0 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65  e process can be
11ad0 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
11ae0 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e  abase at a time.
11af0 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73  .**.** Omit this
11b00 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49   section if SQLI
11b10 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
11b20 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65  G_STYLE is turne
11b30 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63  d off or if.** c
11b40 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57  ompiling for VXW
11b50 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ORKS..*/.#if SQL
11b60 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
11b70 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
11b80 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52  VXWORKS../*.** R
11b90 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c  etry flock() cal
11ba0 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69 74  ls that fail wit
11bb0 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65  h EINTR.*/.#ifde
11bc0 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69  f EINTR.static i
11bd0 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  nt robust_flock(
11be0 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b  int fd, int op){
11bf0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
11c00 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f   rc = flock(fd,o
11c10 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  p); }while( rc<0
11c20 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
11c30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
11c40 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
11c50 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61  e robust_flock(a
11c60 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23  ,b) flock(a,b).#
11c70 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a  endif.     ../*.
11c80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11c90 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
11ca0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
11cb0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
11cc0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
11cd0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
11ce0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
11cf0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
11d00 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
11d10 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
11d20 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
11d30 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
11d40 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
11d50 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
11d60 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
11d70 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
11d80 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
11d90 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
11da0 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
11db0 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b  c int flockCheck
11dc0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
11dd0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11de0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
11df0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11e00 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
11e10 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
11e20 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11e30 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
11e40 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
11e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
11e60 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
11e70 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
11e80 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11e90 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
11ea0 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
11eb0 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
11ec0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
11ed0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
11ee0 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
11ef0 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
11f00 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
11f10 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
11f20 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
11f30 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
11f40 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
11f50 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61  rved ){.    /* a
11f60 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68  ttempt to get th
11f70 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
11f80 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  t lrc = robust_f
11f90 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
11fa0 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
11fb0 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20  );.    if( !lrc 
11fc0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20  ){.      /* got 
11fd0 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  the lock, unlock
11fe0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63   it */.      lrc
11ff0 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
12000 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
12010 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c  N);.      if ( l
12020 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69  rc ) {.        i
12030 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
12040 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e  o;.        /* un
12050 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68  lock failed with
12060 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
12070 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54       lrc = SQLIT
12080 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
12090 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
120a0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
120b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
120c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
120d0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
120e0 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
120f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12100 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
12110 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
12120 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72  rno;.      reser
12130 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  ved = 1;.      /
12140 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  * someone else m
12150 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73  ight have it res
12160 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c  erved */.      l
12170 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
12180 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
12190 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
121a0 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  ERR_LOCK); .    
121b0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
121c0 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
121d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
121e0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
121f0 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
12200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12210 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
12220 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
12230 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d %d (flock)\n",
12240 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
12250 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64  eserved));..#ifd
12260 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
12270 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
12280 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53  RS.  if( (rc & S
12290 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
122a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
122b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
122c0 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  OK;.    reserved
122d0 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  =1;.  }.#endif /
122e0 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
122f0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12300 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20  S */.  *pResOut 
12310 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
12320 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12330 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
12340 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
12350 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
12360 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
12370 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
12380 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
12390 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
123a0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
123b0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
123c0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
123d0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
123e0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
123f0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
12400 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
12410 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
12420 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
12430 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
12440 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
12450 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
12460 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
12470 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
12480 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
12490 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
124a0 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
124b0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
124c0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
124d0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
124e0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
124f0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
12500 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
12510 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
12520 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
12530 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
12540 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
12550 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
12560 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
12570 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
12580 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
12590 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
125a0 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
125b0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
125c0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
125d0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
125e0 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c  *.** flock() onl
125f0 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
12600 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
12610 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
12620 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
12630 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
12640 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
12650 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
12660 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
12670 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
12680 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
12690 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
126a0 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
126b0 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
126c0 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
126d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
126e0 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
126f0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
12700 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
12710 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
12720 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
12730 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
12740 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63  tic int flockLoc
12750 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12760 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
12770 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  k) {.  int rc = 
12780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
12790 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
127a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
127b0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
127c0 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
127d0 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
127e0 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
127f0 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
12800 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
12810 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
12820 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
12830 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
12840 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
12850 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12860 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12880 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12890 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
128a0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69  e lock */.  .  i
128b0 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  f (robust_flock(
128c0 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
128d0 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a  X | LOCK_NB)) {.
128e0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
128f0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64   errno;.    /* d
12900 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20  idn't get, must 
12910 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72  be busy */.    r
12920 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
12930 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
12940 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
12950 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  RR_LOCK);.    if
12960 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12970 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
12980 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12990 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
129a0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
129b0 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
129c0 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
129d0 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ok */.    pFile-
129e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
129f0 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53  leLock;.  }.  OS
12a00 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
12a10 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29  %d %s %s (flock)
12a20 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
12a30 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
12a40 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
12a50 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
12a60 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
12a70 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  "));.#ifdef SQLI
12a80 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
12a90 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
12aa0 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49  ( (rc & SQLITE_I
12ab0 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
12ac0 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20  IOERR ){.    rc 
12ad0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
12ae0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
12af0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
12b00 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
12b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12b20 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
12b30 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
12b40 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
12b50 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
12b60 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
12b70 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
12b80 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
12b90 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
12ba0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
12bb0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
12bc0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
12bd0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
12be0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
12bf0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
12c00 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
12c10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
12c20 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
12c30 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
12c40 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
12c50 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
12c60 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12c70 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
12c80 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
12c90 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
12ca0 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
12cb0 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63   %d pid=%d (floc
12cc0 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
12cd0 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
12ce0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
12cf0 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28  ileLock, getpid(
12d00 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
12d10 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
12d20 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
12d30 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
12d40 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
12d50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
12d60 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
12d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12d80 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
12d90 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
12da0 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
12db0 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
12dc0 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
12dd0 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
12de0 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
12df0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12e00 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
12e10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12e20 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
12e30 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63  o, really, unloc
12e40 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75  k. */.  if( robu
12e50 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
12e60 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23  h, LOCK_UN) ){.#
12e70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
12e80 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
12e90 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e  RRORS.    return
12ea0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
12eb0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
12ec0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
12ed0 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74  RRORS */.    ret
12ee0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
12ef0 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65  _UNLOCK;.  }else
12f00 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
12f10 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
12f20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12f30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
12f40 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
12f50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
12f60 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69   flockClose(sqli
12f70 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
12f80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12f90 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29  E_OK;.  if( id )
12fa0 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63  {.    flockUnloc
12fb0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
12fc0 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e      rc = closeUn
12fd0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
12fe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12ff0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13000 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
13010 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
13020 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORK */../*******
13030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
13040 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f   of the flock lo
13050 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
13060 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
13070 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
13080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130c0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
130d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13110 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
13120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13130 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65  * Begin Named Se
13140 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20  maphore Locking 
13150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13160 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e  ********.**.** N
13170 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
13180 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73  ocking is only s
13190 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f  upported on VxWo
131a0 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  rks..**.** Semap
131b0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
131c0 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e  like dot-lock an
131d0 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20  d flock in that 
131e0 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a  it really only.*
131f0 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55  * supports EXCLU
13200 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f  SIVE locking.  O
13210 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
13220 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72  cess can read or
13230 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61   write.** the da
13240 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61  tabase file at a
13250 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64   time.  This red
13260 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63  uces potential c
13270 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a  oncurrency, but.
13280 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63  ** makes the loc
13290 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
132a0 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f   much easier..*/
132b0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
132c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
132d0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
132e0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
132f0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
13300 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
13310 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
13320 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
13330 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
13340 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
13350 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
13360 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
13370 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
13380 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
13390 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
133a0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
133b0 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
133c0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
133d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
133e0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
133f0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65  tatic int semChe
13400 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
13410 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13420 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
13430 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13440 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
13450 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
13460 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13470 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
13480 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
13490 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
134a0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
134b0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
134c0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
134d0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
134e0 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
134f0 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
13500 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
13510 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
13520 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
13530 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
13540 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
13550 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
13560 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
13570 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
13580 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
13590 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74  ved ){.    sem_t
135a0 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
135b0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
135c0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
135d0 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20  atBuf;..    if( 
135e0 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
135f0 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  )==-1 ){.      i
13600 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
13610 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47  o;.      if( EAG
13620 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  AIN != tErrno ){
13630 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13640 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
13650 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
13660 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
13670 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
13680 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
13690 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
136a0 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  no;.      } else
136b0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f   {.        /* so
136c0 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74  meone else has t
136d0 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20  he lock when we 
136e0 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a  are in NO_LOCK *
136f0 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76  /.        reserv
13700 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69  ed = (pFile->eFi
13710 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f  leLock < SHARED_
13720 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
13730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13740 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
13750 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
13760 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
13770 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
13780 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
13790 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
137a0 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c   %d %d (sem)\n",
137b0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
137c0 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
137d0 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
137e0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
137f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
13800 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
13810 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
13820 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
13830 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
13840 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
13850 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
13860 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
13870 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
13880 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
13890 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
138a0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
138b0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
138c0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
138d0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
138e0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
138f0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
13900 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
13910 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
13920 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
13930 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
13940 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
13950 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
13960 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
13970 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
13980 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
13990 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
139a0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
139b0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
139c0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
139d0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
139e0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
139f0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
13a00 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
13a10 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
13a20 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
13a30 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
13a40 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
13a50 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
13a60 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
13a70 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
13a80 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
13a90 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
13aa0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  USIVE.**.** Sema
13ab0 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79  phore locks only
13ac0 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
13ad0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
13ae0 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
13af0 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
13b00 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
13b10 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
13b20 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
13b30 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
13b40 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
13b50 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
13b60 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
13b70 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
13b80 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
13b90 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
13ba0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
13bb0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
13bc0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
13bd0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
13be0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
13bf0 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
13c00 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
13c10 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73  ic int semLock(s
13c20 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13c30 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
13c40 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
13c50 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13c60 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
13c70 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
13c80 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
13c90 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
13ca0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
13cb0 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
13cc0 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
13cd0 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
13ce0 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
13cf0 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
13d00 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
13d10 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
13d20 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
13d30 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
13d40 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
13d50 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53  Lock;.    rc = S
13d60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
13d70 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
13d80 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
13d90 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
13da0 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
13db0 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
13dc0 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
13dd0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
13de0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
13df0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
13e00 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
13e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
13e20 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
13e30 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
13e40 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
13e50 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13e60 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  .. sem_end_lock:
13e70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13e80 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
13e90 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13ea0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
13eb0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
13ec0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
13ed0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
13ee0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
13ef0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
13f00 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
13f10 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
13f20 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13f30 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
13f40 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
13f50 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
13f60 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
13f70 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
13f80 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e  static int semUn
13f90 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
13fa0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
13fb0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
13fc0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
13fd0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
13fe0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
13ff0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
14000 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
14020 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  em );.  OSTRACE(
14030 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
14040 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73  was %d pid=%d (s
14050 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
14060 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
14070 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
14080 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
14090 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
140a0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
140b0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
140c0 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
140d0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
140e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
140f0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
14100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14110 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
14120 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
14130 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
14140 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
14150 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
14160 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
14170 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
14180 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14190 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
141a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
141b0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
141c0 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63  no, really unloc
141d0 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d  k. */.  if ( sem
141e0 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20  _post(pSem)==-1 
141f0 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20  ) {.    int rc, 
14200 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
14210 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
14220 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
14230 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
14240 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
14250 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
14260 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
14270 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
14280 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
14290 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
142a0 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
142b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
142c0 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
142d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
142e0 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  . ** Close a fil
142f0 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e.. */.static in
14300 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74  t semClose(sqlit
14310 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
14320 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
14330 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14340 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14350 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64      semUnlock(id
14360 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
14370 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14380 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
14390 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61  tex();.    relea
143a0 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
143b0 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  e);.    unixLeav
143c0 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c  eMutex();.    cl
143d0 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
143e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
143f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
14400 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
14410 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20   */./*.** Named 
14420 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
14430 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
14440 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ble on VxWorks..
14450 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
14460 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61  ** End of the na
14470 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
14480 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
14490 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
144a0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
144b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144f0 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
14500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14540 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
14550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14560 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69   Begin AFP Locki
14570 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
14580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14590 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69  ****.**.** AFP i
145a0 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69  s the Apple Fili
145b0 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46  ng Protocol.  AF
145c0 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66  P is a network f
145d0 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a  ilesystem found.
145e0 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69  ** on Apple Maci
145f0 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20  ntosh computers 
14600 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f  - both OS9 and O
14610 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d  SX..**.** Third-
14620 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61  party implementa
14630 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65  tions of AFP are
14640 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74   available.  But
14650 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a   this code here.
14660 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e  ** only works on
14670 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65   OSX..*/..#if de
14680 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
14690 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
146a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
146b0 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63  /*.** The afpLoc
146c0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
146d0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
146e0 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63  ll afp lock spec
146f0 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79  ific state.*/.ty
14700 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
14710 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
14720 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14730 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
14740 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  ingContext {.  i
14750 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63  nt reserved;.  c
14760 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
14770 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
14780 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
14790 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73  en file */.};..s
147a0 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
147b0 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67  ockPB2.{.  unsig
147c0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
147d0 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
147e0 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
147f0 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  byte to lock */.
14800 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
14810 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20  long length;    
14820 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79      /* nbr of by
14830 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
14840 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
14850 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72  ong retRangeStar
14860 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74  t; /* nbr of 1st
14870 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20   byte locked if 
14880 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20  successful */.  
14890 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e  unsigned char un
148a0 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20  LockFlag;       
148b0 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c    /* 1 = unlock,
148c0 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   0 = lock */.  u
148d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61  nsigned char sta
148e0 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20  rtEndFlag;      
148f0 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64   /* 1=rel to end
14900 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20   of fork, 0=rel 
14910 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e  to start */.  in
14920 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20  /* file desc to 
14950 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20  assoc this lock 
14960 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  with */.};..#def
14970 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e  ine afpfsByteRan
14980 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20  geLock2FSCTL    
14990 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32      _IOWR('z', 2
149a0 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
149b0 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a  ngeLockPB2)../*.
149c0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69  ** This is a uti
149d0 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67  lity for setting
149e0 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62   or clearing a b
149f0 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e  it-range lock on
14a00 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73   an.** AFP files
14a10 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65  ystem..** .** Re
14a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
14a30 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
14a40 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72  E_BUSY on failur
14a50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
14a60 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63   afpSetLock(.  c
14a70 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a90 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
14aa0 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f  e to be locked o
14ab0 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  r unlocked */.  
14ac0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14ae0 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
14af0 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a  riptor on path *
14b00 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
14b10 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20  g long offset,  
14b20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
14b30 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
14b40 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
14b50 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20   long length,   
14b60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
14b70 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
14b80 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61    int setLockFla
14b90 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
14ba0 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20   /* True to set 
14bb0 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20  lock.  False to 
14bc0 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  clear lock */.){
14bd0 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61  .  struct ByteRa
14be0 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20  ngeLockPB2 pb;. 
14bf0 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70   int err;.  .  p
14c00 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73  b.unLockFlag = s
14c10 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a  etLockFlag ? 0 :
14c20 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e   1;.  pb.startEn
14c30 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e  dFlag = 0;.  pb.
14c40 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b  offset = offset;
14c50 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c  .  pb.length = l
14c60 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20  ength; .  pb.fd 
14c70 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20  = pFile->h;.  . 
14c80 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
14c90 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25  TLOCK [%s] for %
14ca0 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c  d%s in range %ll
14cb0 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
14cc0 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
14cd0 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d  ":"OFF"), pFile-
14ce0 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22  >h, (pb.fd==-1?"
14cf0 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29  [testval-1]":"")
14d00 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65  ,.    offset, le
14d10 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20  ngth));.  err = 
14d20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66  fsctl(path, afpf
14d30 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46  sByteRangeLock2F
14d40 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20  SCTL, &pb, 0);. 
14d50 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20   if ( err==-1 ) 
14d60 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
14d70 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
14d80 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43  rrno;.    OSTRAC
14d90 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66  E(("AFPSETLOCK f
14da0 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29  ailed to fsctl()
14db0 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a   '%s' %d %s\n",.
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74               pat
14dd0 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72  h, tErrno, strer
14de0 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23  ror(tErrno)));.#
14df0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
14e00 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
14e10 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ORS.    rc = SQL
14e20 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a  ITE_BUSY;.#else.
14e30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
14e40 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
14e50 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  or(tErrno,.     
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
14e70 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c  etLockFlag ? SQL
14e80 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a  ITE_IOERR_LOCK :
14e90 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
14ea0 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  LOCK);.#endif /*
14eb0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
14ec0 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  FP_LOCK_ERRORS *
14ed0 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  /.    if( IS_LOC
14ee0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
14ef0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
14f00 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
14f10 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
14f20 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
14f30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14f40 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
14f50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14f60 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
14f70 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
14f80 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
14f90 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
14fa0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
14fb0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
14fc0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
14fd0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
14fe0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
14ff0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
15000 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
15010 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
15020 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
15030 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
15040 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
15050 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
15060 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
15070 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
15080 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
15090 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
150a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
150b0 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
150c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
150d0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
150e0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
150f0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
15100 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f  ile*)id;.  afpLo
15110 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
15120 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75  ntext;.  .  Simu
15130 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
15140 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15150 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
15160 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
15170 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63  rt( pFile );.  c
15180 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
15190 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
151a0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
151b0 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74  text;.  if( cont
151c0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
151d0 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  .    *pResOut = 
151e0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
151f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
15200 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
15210 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
15220 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
15230 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
15240 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68  ds */.  .  /* Ch
15250 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
15260 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
15270 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
15280 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
15290 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
152a0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
152b0 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
152c0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
152d0 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
152e0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
152f0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
15300 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65    */.  if( !rese
15310 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  rved ){.    /* l
15320 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44  ock the RESERVED
15330 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74   byte */.    int
15340 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
15350 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
15360 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
15370 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20  ED_BYTE, 1,1);  
15380 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
15390 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20  OK==lrc ){.     
153a0 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
153b0 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
153c0 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
153d0 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
153e0 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
153f0 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
15400 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  e */.      lrc =
15410 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
15420 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
15430 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
15440 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
15450 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
15460 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  if we failed to 
15470 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65  get the lock the
15480 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  n someone else m
15490 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20  ust have it */. 
154a0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
154b0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
154c0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
154d0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  rc) ){.      rc=
154e0 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lrc;.    }.  }. 
154f0 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
15500 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
15510 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
15520 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22  d %d %d (afp)\n"
15530 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
15540 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20  reserved));.  . 
15550 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
15560 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
15570 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
15580 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
15590 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
155a0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
155b0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
155c0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
155d0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
155e0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
155f0 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
15600 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
15610 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
15620 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
15630 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
15640 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
15650 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
15660 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
15670 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
15680 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
15690 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
156a0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
156b0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
156c0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
156d0 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
156e0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
156f0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
15700 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
15710 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
15720 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
15730 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
15740 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
15750 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
15760 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
15770 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
15780 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
15790 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
157a0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
157b0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
157c0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
157d0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
157e0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
157f0 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
15800 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
15810 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
15820 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
15830 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
15840 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
15850 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
15860 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
15870 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
15880 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
15890 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
158a0 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c   int afpLock(sql
158b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
158c0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
158d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
158e0 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
158f0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15900 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
15910 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
15920 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
15930 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
15940 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
15950 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
15960 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
15970 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a  kingContext;.  .
15980 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
15990 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
159a0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
159b0 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
159c0 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
159d0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
159e0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
159f0 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
15a00 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
15a10 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
15a20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f   azFileLock(pIno
15a30 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  de->eFileLock), 
15a40 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
15a50 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
15a60 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
15a70 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
15a80 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
15a90 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
15aa0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
15ab0 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
15ac0 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
15ad0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  afp_end_lock: ex
15ae0 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
15af0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
15b00 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
15b10 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
15b20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
15b30 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b  eLock>=eFileLock
15b40 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
15b50 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
15b60 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
15b70 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  ) (afp)\n", pFil
15b80 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
15b90 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
15ba0 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65  eLock)));.    re
15bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15bc0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
15bd0 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
15be0 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
15bf0 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ect.  **  (1) We
15c00 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
15c10 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
15c20 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
15c30 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
15c40 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
15c50 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
15c60 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
15c70 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
15c80 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
15c90 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
15ca0 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
15cb0 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
15cc0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
15cd0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15ce0 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46  k!=NO_LOCK || eF
15cf0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
15d00 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
15d10 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e  ( eFileLock!=PEN
15d20 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
15d30 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
15d40 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
15d50 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  || pFile->eFileL
15d60 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
15d70 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73   );.  .  /* This
15d80 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
15d90 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
15da0 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
15db0 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
15dc0 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
15dd0 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
15de0 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
15df0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  e;..  /* If some
15e00 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
15e10 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
15e20 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
15e30 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
15e40 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
15e50 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
15e60 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
15e70 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
15e80 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  f( (pFile->eFile
15e90 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46  Lock!=pInode->eF
15ea0 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20  ileLock && .    
15eb0 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
15ec0 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
15ed0 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
15ee0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
15ef0 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20      ){.    rc = 
15f00 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
15f10 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
15f20 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
15f30 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
15f40 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
15f50 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
15f60 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
15f70 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
15f80 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
15f90 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
15fa0 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
15fb0 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
15fc0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
15fd0 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
15fe0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15ff0 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
16000 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
16010 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16020 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  || pInode->eFile
16030 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
16040 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
16050 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
16060 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
16070 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
16080 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
16090 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
160a0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29  ode->nShared>0 )
160b0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ;.    pFile->eFi
160c0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
160d0 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
160e0 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20  ->nShared++;.   
160f0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
16100 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
16110 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20  nd_lock;.  }.   
16120 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47   .  /* A PENDING
16130 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
16140 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
16150 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
16160 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
16170 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
16180 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
16190 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
161a0 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
161b0 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
161c0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sed..  */.  if( 
161d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
161e0 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
161f0 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43   (eFileLock==EXC
16200 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
16210 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
16220 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
16230 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  ){.    int faile
16240 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20  d;.    failed = 
16250 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16260 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16270 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
16280 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28   1, 1);.    if (
16290 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20  failed) {.      
162a0 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
162b0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
162c0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
162d0 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72    .  /* If contr
162e0 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
162f0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
16300 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
16310 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
16320 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
16330 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
16340 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
16350 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
16360 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
16370 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72      int lrc1, lr
16380 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20  c2, lrc1Errno = 
16390 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20  0;.    long lk, 
163a0 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61  mask;.    .    a
163b0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
163c0 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20  Shared==0 );.   
163d0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
163e0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
163f0 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61  .        .    ma
16400 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e  sk = (sizeof(lon
16410 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54  g)==8) ? LARGEST
16420 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66  _INT64 : 0x7ffff
16430 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  fff;.    /* Now 
16440 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
16450 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  k SHARED_LOCK */
16460 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61  .    /* note tha
16470 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66  t the quality of
16480 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
16490 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74  doesn't matter t
164a0 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20  hat much */.    
164b0 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a  lk = random(); .
164c0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
164d0 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d  edByte = (lk & m
164e0 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a  ask)%(SHARED_SIZ
164f0 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31  E - 1);.    lrc1
16500 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16510 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16520 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
16530 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
16540 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
16550 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  , 1, 1);.    if(
16560 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
16570 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72  rc1) ){.      lr
16580 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d  c1Errno = pFile-
16590 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
165a0 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  }.    /* Drop th
165b0 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
165c0 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
165d0 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc2 = afpSetLoc
165e0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
165f0 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
16600 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  G_BYTE, 1, 0);. 
16610 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c     .    if( IS_L
16620 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
16630 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
16640 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63  >lastErrno = lrc
16650 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  1Errno;.      rc
16660 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67   = lrc1;.      g
16670 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
16680 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
16690 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
166a0 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63  rc2) ){.      rc
166b0 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67   = lrc2;.      g
166c0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
166d0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
166e0 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f   lrc1 != SQLITE_
166f0 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20  OK ) {.      rc 
16700 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c  = lrc1;.    } el
16710 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  se {.      pFile
16720 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
16730 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
16740 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
16750 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
16760 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  nShared = 1;.   
16770 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
16780 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
16790 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f  IVE_LOCK && pIno
167a0 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
167b0 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
167c0 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
167d0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
167e0 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
167f0 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73  n this.     ** s
16800 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
16810 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
16820 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
16830 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16840 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
16850 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
16860 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
16870 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
16880 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
16890 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
168a0 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
168b0 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
168c0 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
168d0 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
168e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66      */.    int f
168f0 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61  ailed = 0;.    a
16900 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
16910 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
16920 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20    if (eFileLock 
16930 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  >= RESERVED_LOCK
16940 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
16950 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f  Lock < RESERVED_
16960 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
16970 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
16980 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ERVED lock */.  
16990 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
169a0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
169b0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
169c0 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
169d0 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28   1,1);.      if(
169e0 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20   !failed ){.    
169f0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
16a00 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
16a10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
16a20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c  (!failed && eFil
16a30 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49  eLock == EXCLUSI
16a40 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  VE_LOCK) {.     
16a50 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
16a60 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f  XCLUSIVE lock */
16a70 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
16a80 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68  /* Remove the sh
16a90 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65  ared lock before
16aa0 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67   trying the rang
16ab0 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74  e.  we'll need t
16ac0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73  o .      ** rees
16ad0 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
16ae0 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61  ed lock if we ca
16af0 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70  n't get the  afp
16b00 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a  Unlock.      */.
16b10 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c        if( !(fail
16b20 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
16b30 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16b40 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
16b50 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20  IRST +.         
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b70 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
16b80 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20  te, 1, 0)) ){.  
16b90 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64        int failed
16ba0 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
16bb0 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74         /* now at
16bc0 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68  temmpt to get th
16bd0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
16be0 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20   range */.      
16bf0 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
16c00 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16c10 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
16c20 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20  ARED_FIRST, .   
16c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c40 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
16c50 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20  ED_SIZE, 1);.   
16c60 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20       if( failed 
16c70 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66  && (failed2 = af
16c80 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16c90 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16ca0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
16cb0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
16cc0 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e  FIRST + pInode->
16cd0 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
16ce0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
16cf0 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62  /* Can't reestab
16d00 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
16d10 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61  lock.  Sqlite ca
16d20 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69  n't deal, this i
16d30 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
16d40 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72   critical I/O er
16d50 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ror.          */
16d60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
16d70 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54  ((failed & SQLIT
16d80 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
16d90 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c  TE_IOERR) ? fail
16da0 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20  ed2 : .         
16db0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45        SQLITE_IOE
16dc0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
16dd0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
16de0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20  lock;.        } 
16df0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16e00 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
16e10 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d; .      }.    
16e20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64  }.    if( failed
16e30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
16e40 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ailed;.    }.  }
16e50 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
16e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
16e70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16e80 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
16e90 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
16ea0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
16eb0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
16ec0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
16ed0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
16ee0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
16ef0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
16f00 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
16f10 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
16f20 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65  CK;.  }.  .afp_e
16f30 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
16f40 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
16f50 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
16f60 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29 5c   %d %s %s (afp)\
16f70 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
16f80 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
16f90 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72  ck), .         r
16fa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
16fb0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
16fc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16fd0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
16fe0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
16ff0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
17000 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
17010 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
17020 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
17030 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
17040 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
17050 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
17060 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
17070 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
17080 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
17090 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
170a0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
170b0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
170c0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
170d0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55  .static int afpU
170e0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
170f0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
17100 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72  eLock) {.  int r
17110 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17120 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17130 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17140 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
17150 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  o *pInode;.  afp
17160 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
17170 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
17180 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
17190 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
171a0 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69  ntext;.  int ski
171b0 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66  pShared = 0;.#if
171c0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
171d0 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d    int h = pFile-
171e0 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  >h;.#endif..  as
171f0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
17200 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
17210 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
17220 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61  %d,%d) pid=%d (a
17230 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
17240 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
17250 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
17260 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
17270 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
17280 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
17290 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
172a0 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
172b0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
172c0 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
172d0 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
172e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
172f0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
17300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17310 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
17320 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
17330 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
17340 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
17350 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
17360 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
17370 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
17380 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
17390 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
173a0 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
173b0 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
173c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
173d0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
173e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
173f0 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69   h=(-1) ).    Si
17400 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
17410 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66  ign(0);.    .#if
17420 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
17430 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
17440 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
17450 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
17460 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
17470 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
17480 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17490 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
174a0 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
174b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
174c0 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
174d0 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
174e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
174f0 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
17500 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
17510 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
17520 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
17530 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
17540 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
17550 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
17560 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
17570 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
17580 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
17590 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
175a0 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
175b0 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
175c0 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
175d0 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
175e0 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
175f0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
17600 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
17610 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
17620 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  Write==0.       
17630 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
17640 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
17650 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
17660 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
17670 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  );.    pFile->in
17680 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
17690 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20  .#endif.    .   
176a0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
176b0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
176c0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
176d0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
176e0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
176f0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
17700 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  RST, SHARED_SIZE
17710 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
17720 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17730 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
17740 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
17750 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29  de->nShared>1) )
17760 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c  {.        /* onl
17770 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74  y re-establish t
17780 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
17790 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
177a0 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65         int share
177b0 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
177c0 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
177d0 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
177e0 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
177f0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17800 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
17810 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
17820 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  1);.      } else
17830 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53   {.        skipS
17840 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  hared = 1;.     
17850 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
17860 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17870 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
17880 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
17890 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
178a0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
178b0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
178c0 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
178d0 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20  1, 0);.    } .  
178e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
178f0 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
17900 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ileLock>=RESERVE
17910 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78  D_LOCK && contex
17920 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
17930 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
17940 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17950 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
17960 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
17970 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63  );.      if( !rc
17980 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e   ){ .        con
17990 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
179a0 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20   0; .      }.   
179b0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
179c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
179d0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
179e0 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
179f0 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20  Shared>1)){.    
17a00 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
17a10 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
17a20 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
17a30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17a40 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e   && eFileLock==N
17a50 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f  O_LOCK ){..    /
17a60 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
17a70 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
17a80 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
17a90 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
17aa0 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
17ab0 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
17ac0 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
17ad0 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
17ae0 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
17af0 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
17b00 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
17b10 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63  g long sharedLoc
17b20 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
17b30 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
17b40 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e  redByte;.    pIn
17b50 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
17b60 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
17b70 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
17b80 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17b90 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
17ba0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17bb0 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
17bc0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17bd0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
17be0 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61      if( !skipSha
17bf0 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
17c00 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
17c10 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17c20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
17c30 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  kByte, 1, 0);.  
17c40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
17c50 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !rc ){.        p
17c60 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17c70 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
17c80 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
17c90 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
17ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17cb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17cc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  _OK ){.      pIn
17cd0 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
17ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
17cf0 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
17d00 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
17d10 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
17d20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
17d30 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
17d40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17d50 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
17d60 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
17d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
17d80 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
17d90 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
17da0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17db0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20   Close a file & 
17dc0 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63  cleanup AFP spec
17dd0 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  ific locking con
17de0 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20  text .*/.static 
17df0 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c  int afpClose(sql
17e00 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
17e10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17e20 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20  TE_OK;.  if( id 
17e30 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
17e40 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
17e50 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55  le*)id;.    afpU
17e60 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
17e70 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  K);.    unixEnte
17e80 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66  rMutex();.    if
17e90 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  ( pFile->pInode 
17ea0 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
17eb0 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ->nLock ){.     
17ec0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
17ed0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
17ee0 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
17ef0 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
17f00 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a  le just.      **
17f10 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
17f20 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
17f30 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
17f40 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
17f50 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
17f60 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
17f70 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77  >aPending.  It w
17f80 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
17f90 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e  ally closed when
17fa0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
17fb0 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
17fc0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
17fd0 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
17fe0 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
17ff0 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
18000 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 73  fo(pFile);.    s
18010 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
18020 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
18030 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f  t);.    rc = clo
18040 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
18050 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
18060 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ex();.  }.  retu
18070 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
18080 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
18090 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
180a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
180b0 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
180c0 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73  he code above is
180d0 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
180e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
180f0 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69  he code is speci
18100 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58  fic.** to MacOSX
18110 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f   and does not wo
18120 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78  rk on other unix
18130 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20   platforms.  No 
18140 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69  alternative.** i
18150 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  s available.  If
18160 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69   you don't compi
18170 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68  le for a mac, th
18180 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70  en the "unix-afp
18190 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20  ".** VFS is not 
181a0 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
181b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
181c0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41  *** End of the A
181d0 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
181e0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
181f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
18200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
18250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
182a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
182c0 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   NFS Locking ***
182d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
182f0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
18300 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
18310 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
18320 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77  STYLE./*. ** Low
18330 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
18340 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
18350 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
18360 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
18370 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20  leLock. ** must 
18380 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
18390 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
183a0 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65  .. **. ** If the
183b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
183c0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
183d0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
183e0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a   at or below. **
183f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
18400 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
18410 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
18420 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69  no-op.. */.stati
18430 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28  c int nfsUnlock(
18440 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18450 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
18460 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  {.  return posix
18470 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
18480 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e  Lock, 1);.}..#en
18490 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
184a0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
184b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
184c0 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
184d0 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
184e0 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   is the NFS lock
184f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
18500 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
18510 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
18520 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
18530 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
18540 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
18550 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
18560 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
18570 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   .**.***********
18580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
18590 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  f the NFS lock i
185a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
185b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185c0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
185d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18610 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
18620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18660 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
18670 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69  ****** Non-locki
18680 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ng sqlite3_file 
18690 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
186a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186b0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
186c0 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f  next division co
186d0 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74  ntains implement
186e0 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d  ations for all m
186f0 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a  ethods of the .*
18700 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f  * sqlite3_file o
18710 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e  bject other than
18720 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   the locking met
18730 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69  hods.  The locki
18740 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65  ng.** methods we
18750 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69  re defined in di
18760 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f  visions above (o
18770 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ne locking metho
18780 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f  d per.** divisio
18790 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f  n).  Those metho
187a0 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d  ds that are comm
187b0 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
187c0 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67  g modes.** are g
187d0 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69  ather together i
187e0 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f  nto this divisio
187f0 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  n..*/../*.** See
18800 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
18810 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
18820 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74  cond argument, t
18830 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a  hen read cnt .**
18840 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
18850 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
18860 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
18870 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a  ually read..**.*
18880 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65  * NB:  If you de
18890 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f  fine USE_PREAD o
188a0 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74  r USE_PREAD64, t
188b0 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73  hen it might als
188c0 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72  o.** be necessar
188d0 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  y to define _XOP
188e0 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20  EN_SOURCE to be 
188f0 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65  500.  This varie
18900 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79  s from.** one sy
18910 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e  stem to another.
18920 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64    Since SQLite d
18930 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55  oes not define U
18940 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20  SE_PREAD.** any 
18950 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61  any form by defa
18960 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74  ult, we will not
18970 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69   attempt to defi
18980 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
18990 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73  ..** See tickets
189a0 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31   #2741 and #2681
189b0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
189c0 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
189d0 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
189e0 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c  ailed read the l
189f0 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
18a00 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
18a10 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
18a20 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
18a30 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
18a40 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
18a50 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
18a60 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
18a70 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20   int got;.  int 
18a80 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28  prior = 0;.#if (
18a90 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
18aa0 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
18ab0 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
18ac0 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
18ad0 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
18ae0 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ART;.  assert( c
18af0 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66  nt==(cnt&0x1ffff
18b00 29 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78  ) );.  cnt &= 0x
18b10 31 66 66 66 66 3b 0a 20 20 64 6f 7b 0a 23 69 66  1ffff;.  do{.#if
18b20 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
18b30 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  AD).    got = os
18b40 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
18b50 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
18b60 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
18b70 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
18b80 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
18b90 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20  USE_PREAD64).   
18ba0 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34   got = osPread64
18bb0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18bc0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
18bd0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18be0 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
18bf0 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  se.    newOffset
18c00 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
18c10 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
18c20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
18c30 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
18c40 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  t-- );.    if( n
18c50 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
18c60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
18c70 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
18c80 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46  .        ((unixF
18c90 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
18ca0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
18cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18cc0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18cd0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
18ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18cf0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
18d00 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61  .    got = osRea
18d10 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
18d20 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nt);.#endif.    
18d30 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62  if( got==cnt ) b
18d40 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f  reak;.    if( go
18d50 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  t<0 ){.      if(
18d60 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b   errno==EINTR ){
18d70 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e   got = 1; contin
18d80 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f  ue; }.      prio
18d90 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 28 28 75  r = 0;.      ((u
18da0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18db0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18dc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18dd0 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e    }else if( got>
18de0 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d  0 ){.      cnt -
18df0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66  = got;.      off
18e00 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20  set += got;.    
18e10 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a    prior += got;.
18e20 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f        pBuf = (vo
18e30 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72  id*)(got + (char
18e40 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  *)pBuf);.    }. 
18e50 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29   }while( got>0 )
18e60 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
18e70 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
18e80 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
18e90 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20  d %llu\n",.     
18ea0 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f         id->h, go
18eb0 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d  t+prior, offset-
18ec0 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41  prior, TIMER_ELA
18ed0 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
18ee0 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f   got+prior;.}../
18ef0 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
18f00 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
18f10 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
18f20 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
18f30 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
18f40 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
18f50 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
18f60 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
18f70 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
18f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
18f90 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
18fa0 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
18fb0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
18fc0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
18fd0 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
18fe0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18ff0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
19000 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  id;.  int got;. 
19010 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a   assert( id );..
19020 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
19030 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
19040 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
19050 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
19060 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
19070 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
19080 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
19090 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
190a0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
190b0 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
190c0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
190d0 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
190e0 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
190f0 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
19100 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
19110 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
19120 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f   );.#endif..  go
19130 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  t = seekAndRead(
19140 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
19150 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28  Buf, amt);.  if(
19160 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
19170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19180 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  K;.  }else if( g
19190 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  ot<0 ){.    /* l
191a0 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
191b0 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
191c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
191d0 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d  _IOERR_READ;.  }
191e0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
191f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20  >lastErrno = 0; 
19200 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
19210 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20  error */.    /* 
19220 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
19230 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
19240 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
19250 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
19260 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
19270 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
19280 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19290 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
192a0 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
192b0 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
192c0 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
192d0 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
192e0 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
192f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
19300 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
19310 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
19320 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
19330 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
19340 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
19350 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
19360 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c  iled write the l
19370 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
19380 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
19390 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
193a0 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
193b0 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a  Write(unixFile *
193c0 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  id, i64 offset, 
193d0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
193e0 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
193f0 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66  t got;.#if (!def
19400 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
19410 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f  && !defined(USE_
19420 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20  PREAD64)).  i64 
19430 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69  newOffset;.#endi
19440 66 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  f.  assert( cnt=
19450 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20 29  =(cnt&0x1ffff) )
19460 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78 31 66 66  ;.  cnt &= 0x1ff
19470 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  ff;.  TIMER_STAR
19480 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  T;.#if defined(U
19490 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20  SE_PREAD).  do{ 
194a0 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 28 69  got = osPwrite(i
194b0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
194c0 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65   offset); }while
194d0 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
194e0 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66  ==EINTR );.#elif
194f0 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
19500 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74 20  AD64).  do{ got 
19510 3d 20 6f 73 50 77 72 69 74 65 36 34 28 69 64 2d  = osPwrite64(id-
19520 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
19530 66 66 73 65 74 29 3b 7d 77 68 69 6c 65 28 20 67  ffset);}while( g
19540 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ot<0 && errno==E
19550 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64  INTR);.#else.  d
19560 6f 7b 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  o{.    newOffset
19570 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
19580 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
19590 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
195a0 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
195b0 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  t-- );.    if( n
195c0 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
195d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
195e0 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
195f0 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46  .        ((unixF
19600 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
19610 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
19620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19630 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
19640 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
19650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19660 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
19670 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 57 72 69  .    got = osWri
19680 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
19690 63 6e 74 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  cnt);.  }while( 
196a0 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
196b0 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a  EINTR );.#endif.
196c0 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69    TIMER_END;.  i
196d0 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
196e0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
196f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
19700 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  no;.  }..  OSTRA
19710 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d 33  CE(("WRITE   %-3
19720 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
19730 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c  \n", id->h, got,
19740 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45   offset, TIMER_E
19750 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75  LAPSED));.  retu
19760 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn got;.}.../*.*
19770 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
19780 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
19790 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
197a0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
197b0 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
197c0 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
197d0 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
197e0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57  static int unixW
197f0 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  rite(.  sqlite3_
19800 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e  file *id, .  con
19810 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  st void *pBuf, .
19820 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
19830 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
19840 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  t .){.  unixFile
19850 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
19860 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77  ile*)id;.  int w
19870 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  rote = 0;.  asse
19880 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
19890 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20  rt( amt>0 );..  
198a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
198b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
198c0 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
198d0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
198e0 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
198f0 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
19900 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
19910 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
19920 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
19930 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
19940 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
19950 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
19960 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
19970 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
19980 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
19990 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
199a0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
199b0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
199c0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
199d0 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
199e0 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
199f0 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
19a00 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61   to.  ** doing a
19a10 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
19a20 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
19a30 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
19a40 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20  her than a.  ** 
19a50 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
19a60 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72  file) then recor
19a70 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
19a80 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
19a90 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  * has changed.  
19aa0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
19ab0 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f  on counter is mo
19ac0 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74  dified, record t
19ad0 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f  hat.  ** fact to
19ae0 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  o..  */.  if( pF
19af0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
19b00 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  te ){.    pFile-
19b10 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20  >dbUpdate = 1;  
19b20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
19b30 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
19b40 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66  d */.    if( off
19b50 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65  set<=24 && offse
19b60 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20  t+amt>=27 ){.   
19b70 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
19b80 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d   char oldCntr[4]
19b90 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
19ba0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
19bb0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65  ;.      rc = see
19bc0 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
19bd0 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b  24, oldCntr, 4);
19be0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
19bf0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
19c00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34  .      if( rc!=4
19c10 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e   || memcmp(oldCn
19c20 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75  tr, &((char*)pBu
19c30 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34  f)[24-offset], 4
19c40 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
19c50 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
19c60 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68  Chng = 1;  /* Th
19c70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
19c80 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65  unter has change
19c90 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
19ca0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
19cb0 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26   while( amt>0 &&
19cc0 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e   (wrote = seekAn
19cd0 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66  dWrite(pFile, of
19ce0 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
19cf0 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d  )>0 ){.    amt -
19d00 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66  = wrote;.    off
19d10 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20  set += wrote;.  
19d20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
19d30 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
19d40 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f    }.  SimulateIO
19d50 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d  Error(( wrote=(-
19d60 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20  1), amt=1 ));.  
19d70 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
19d80 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c  Error(( wrote=0,
19d90 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66   amt=1 ));..  if
19da0 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( amt>0 ){.    i
19db0 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46  f( wrote<0 && pF
19dc0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d  ile->lastErrno!=
19dd0 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20  ENOSPC ){.      
19de0 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
19df0 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65   by seekAndWrite
19e00 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
19e10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
19e20 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
19e30 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
19e40 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e  tErrno = 0; /* n
19e50 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
19e60 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
19e70 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
19e80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
19e90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19ea0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
19eb0 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
19ec0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
19ed0 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
19ee0 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
19ef0 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
19f00 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
19f10 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
19f20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65  occurring at the
19f30 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
19f40 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
19f50 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
19f60 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
19f70 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
19f80 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f  dif../*.** We do
19f90 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65   not trust syste
19fa0 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ms to provide a 
19fb0 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e  working fdatasyn
19fc0 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a  c().  Some do..*
19fd0 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20  * Others do no. 
19fe0 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20   To be safe, we 
19ff0 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20  will stick with 
1a000 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c  the (slightly sl
1a010 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29  ower).** fsync()
1a020 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  . If you know th
1a030 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
1a040 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
1a050 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
1a060 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
1a070 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
1a080 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
1a090 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66  sync.*/.#if !def
1a0a0 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 0a  ined(fdatasync).
1a0b0 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79  # define fdatasy
1a0c0 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a  nc fsync.#endif.
1a0d0 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41  ./*.** Define HA
1a0e0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20  VE_FULLFSYNC to 
1a0f0 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67  0 or 1 depending
1a100 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
1a110 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c  ot.** the F_FULL
1a120 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  FSYNC macro is d
1a130 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46  efined.  F_FULLF
1a140 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c  SYNC is currentl
1a150 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61  y.** only availa
1a160 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e  ble on Mac OS X.
1a170 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64    But that could
1a180 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64   change..*/.#ifd
1a190 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  ef F_FULLFSYNC.#
1a1a0 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
1a1b0 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23  LFSYNC 1.#else.#
1a1c0 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
1a1d0 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a  LFSYNC 0.#endif.
1a1e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
1a1f0 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
1a200 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
1a210 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
1a220 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
1a230 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
1a240 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
1a250 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
1a260 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
1a270 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
1a280 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1a290 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
1a2a0 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
1a2b0 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
1a2c0 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
1a2d0 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
1a2e0 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
1a2f0 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
1a300 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
1a310 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
1a320 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
1a330 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
1a340 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
1a350 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
1a360 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1a370 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
1a380 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
1a390 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
1a3a0 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
1a3b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1a3c0 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73  *.** SQLite sets
1a3d0 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1a3e0 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f  ag if the size o
1a3f0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
1a400 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20  changed..** The 
1a410 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61  idea behind data
1a420 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20  Only is that it 
1a430 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74  should only writ
1a440 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65  e the file conte
1a450 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e  nt.** to disk, n
1a460 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57  ot the inode.  W
1a470 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f  e only set dataO
1a480 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20  nly if the file 
1a490 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68  size is .** unch
1a4a0 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20  anged since the 
1a4b0 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72  file size is par
1a4c0 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20  t of the inode. 
1a4d0 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65   However, .** Te
1a4e0 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20  d Ts'o tells us 
1a4f0 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
1a500 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65   will also write
1a510 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68   the inode if th
1a520 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68  e.** file size h
1a530 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65  as changed.  The
1a540 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65   only real diffe
1a550 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64  rence between fd
1a560 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64  atasync().** and
1a570 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65   fsync(), Ted te
1a580 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20  lls us, is that 
1a590 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
1a5a0 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a   not flush the.*
1a5b0 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d  * inode if the m
1a5c0 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72  time or owner or
1a5d0 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74   other inode att
1a5e0 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61  ributes have cha
1a5f0 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79  nged..** We only
1a600 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1a610 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74  file size, not t
1a620 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74  he other file at
1a630 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20  tributes, so.** 
1a640 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65  as far as SQLite
1a650 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61   is concerned, a
1a660 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73  n fdatasync() is
1a670 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65   always adequate
1a680 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61  ..** So, we alwa
1a690 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63  ys use fdatasync
1a6a0 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69  () if it is avai
1a6b0 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73  lable, regardles
1a6c0 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75  s of.** the valu
1a6d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c  e of the dataOnl
1a6e0 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69  y flag..*/.stati
1a6f0 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
1a700 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
1a710 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
1a720 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
1a730 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1a740 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f  ing "ifdef/elif/
1a750 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73  else/" block has
1a760 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74   the same struct
1a770 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ure as.  ** the 
1a780 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73  one below. It is
1a790 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65   replicated here
1a7a0 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64   solely to avoid
1a7b0 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a   cluttering .  *
1a7c0 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f  * up the real co
1a7d0 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53  de with the UNUS
1a7e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d  ED_PARAMETER() m
1a7f0 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  acros..  */.#ifd
1a800 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1a810 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1a820 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
1a830 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
1a840 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
1a850 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1a860 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45  nly);.#elif HAVE
1a870 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55  _FULLFSYNC.  UNU
1a880 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1a890 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20  taOnly);.#else. 
1a8a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a8b0 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
1a8c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1a8d0 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69  dataOnly);.#endi
1a8e0 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  f..  /* Record t
1a8f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
1a900 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20  es that we do a 
1a910 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61  normal fsync() a
1a920 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e  nd .  ** FULLSYN
1a930 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  C.  This is used
1a940 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
1a950 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
1a960 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20  his procedure.  
1a970 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ** gets called w
1a980 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
1a990 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  arguments..  */.
1a9a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1a9b0 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  ST.  if( fullSyn
1a9c0 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  c ) sqlite3_full
1a9d0 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
1a9e0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1a9f0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
1aa00 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
1aa10 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
1aa20 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
1aa30 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
1aa40 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
1aa50 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1aa60 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53  NO_SYNC.  rc = S
1aa70 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20  QLITE_OK;.#elif 
1aa80 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1aa90 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
1aaa0 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
1aab0 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e  l(fd, F_FULLFSYN
1aac0 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  C, 0);.  }else{.
1aad0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
1aae0 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
1aaf0 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61  FSYNC failed, fa
1ab00 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d  ll back to attem
1ab10 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29  pting an fsync()
1ab20 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64  ..  ** It should
1ab30 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  n't be possible 
1ab40 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f  for fullfsync to
1ab50 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   fail on the loc
1ab60 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79  al .  ** file sy
1ab70 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73  stem (on OSX), s
1ab80 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61  o failure indica
1ab90 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59  tes that FULLFSY
1aba0 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75  NC.  ** isn't su
1abb0 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73  pported for this
1abc0 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f   file system. So
1abd0 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79  , attempt an fsy
1abe0 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f  nc .  ** and (fo
1abf0 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68  r now) ignore th
1ac00 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
1ac10 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74  superfluous fcnt
1ac20 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49  l call.  .  ** I
1ac30 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  t'd be better to
1ac40 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e   detect fullfsyn
1ac50 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61  c support once a
1ac60 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74  nd avoid .  ** t
1ac70 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76  he fcntl call ev
1ac80 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73  ery time sync is
1ac90 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20   called..  */.  
1aca0 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
1acb0 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20  ync(fd);..#elif 
1acc0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1acd0 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e  _).  /* fdatasyn
1ace0 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73  c() on HFS+ does
1acf0 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68  n't yet flush th
1ad00 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69  e file size if i
1ad10 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63  t changed correc
1ad20 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72  tly.  ** so curr
1ad30 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74  ently we default
1ad40 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68   to the macro th
1ad50 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61  at redefines fda
1ad60 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a  tasync to fsync.
1ad70 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e    */.  rc = fsyn
1ad80 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20  c(fd);.#else .  
1ad90 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
1ada0 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
1adb0 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20  KS.  if( rc==-1 
1adc0 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55  && errno==ENOTSU
1add0 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  P ){.    rc = fs
1ade0 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
1adf0 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
1ae00 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69  S */.#endif /* i
1ae10 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1ae20 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55  YNC elif HAVE_FU
1ae30 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66  LLFSYNC */..  if
1ae40 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
1ae50 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72  rc!= -1 ){.    r
1ae60 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
1ae70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ae80 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   Open a file des
1ae90 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64  criptor to the d
1aea0 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1aeb0 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61  ing file zFilena
1aec0 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  me..** If succes
1aed0 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65  sful, *pFd is se
1aee0 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  t to the opened 
1aef0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1af00 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
1af10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1af20 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1af30 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
1af40 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49  NOMEM.** or SQLI
1af50 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72  TE_CANTOPEN is r
1af60 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64  eturned and *pFd
1af70 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e   is set to an un
1af80 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65  defined.** value
1af90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65  ..**.** The dire
1afa0 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
1afb0 69 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f  iptor is used fo
1afc0 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67  r only one thing
1afd0 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29   - to.** fsync()
1afe0 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20   a directory to 
1aff0 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63  make sure file c
1b000 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65  reation and dele
1b010 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61  tion events.** a
1b020 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69  re flushed to di
1b030 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73  sk.  Such fsyncs
1b040 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20   are not needed 
1b050 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72  on newer.** jour
1b060 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65  naling filesyste
1b070 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75  ms, but are requ
1b080 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69  ired on older fi
1b090 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a  lesystems..**.**
1b0a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1b0b0 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
1b0c0 75 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79  using the xSetSy
1b0d0 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  sCall interface.
1b0e0 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20  .** The ability 
1b0f0 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  to override this
1b100 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64   routine was add
1b110 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66  ed in support of
1b120 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d   the.** chromium
1b130 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69   sandbox.  Openi
1b140 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  ng a directory i
1b150 73 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73  s a security ris
1b160 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c  k (we are.** tol
1b170 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20  d) so making it 
1b180 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c  overrideable all
1b190 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d  ows the chromium
1b1a0 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72   sandbox to.** r
1b1b0 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74  eplace this rout
1b1c0 69 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c  ine with a harml
1b1d0 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d  ess no-op.  To m
1b1e0 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ake this routine
1b1f0 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70  .** a no-op, rep
1b200 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73  lace it with a s
1b210 74 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73  tub that returns
1b220 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1b230 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65  eaves.** *pFd se
1b240 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20  t to a negative 
1b250 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  number..**.** If
1b260 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1b270 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  turned, the call
1b280 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
1b290 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a  e for closing.**
1b2a0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1b2b0 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20  ptor *pFd using 
1b2c0 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  close()..*/.stat
1b2d0 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
1b2e0 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20  tory(const char 
1b2f0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
1b300 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b  *pFd){.  int ii;
1b310 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
1b320 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b    char zDirname[
1b330 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
1b340 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
1b350 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
1b360 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73  E, zDirname, "%s
1b370 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
1b380 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72   for(ii=(int)str
1b390 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69  len(zDirname); i
1b3a0 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b  i>1 && zDirname[
1b3b0 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b  ii]!='/'; ii--);
1b3c0 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20  .  if( ii>0 ){. 
1b3d0 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20     zDirname[ii] 
1b3e0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d  = '\0';.    fd =
1b3f0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
1b400 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
1b410 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
1b420 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
1b430 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f       OSTRACE(("O
1b440 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e  PENDIR %-3d %s\n
1b450 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29  ", fd, zDirname)
1b460 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
1b470 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75  pFd = fd;.  retu
1b480 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45  rn (fd>=0?SQLITE
1b490 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72  _OK:unixLogError
1b4a0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
1b4b0 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
1b4c0 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a  Dirname));.}../*
1b4d0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
1b4e0 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
1b4f0 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
1b500 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
1b510 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  isk..**.** If da
1b520 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62  taOnly==0 then b
1b530 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73  oth the file its
1b540 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61  elf and its meta
1b550 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69  data (file.** si
1b560 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c  ze, access time,
1b570 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64   etc) are synced
1b580 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d  .  If dataOnly!=
1b590 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a  0 then only the.
1b5a0 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20  ** file data is 
1b5b0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e  synced..**.** Un
1b5c0 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d  der Unix, also m
1b5d0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1b5e0 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1b5f0 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a  y for the file.*
1b600 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  * has been creat
1b610 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20  ed by fsync-ing 
1b620 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
1b630 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1b640 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64  file..** If we d
1b650 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e  o not do this an
1b660 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61  d we encounter a
1b670 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
1b680 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
1b690 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
1b6a0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
1b6b0 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20   exist after we 
1b6c0 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78  reboot.  The nex
1b6d0 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61  t.** SQLite to a
1b6e0 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77  ccess the file w
1b6f0 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61  ill not know tha
1b700 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78  t the journal ex
1b710 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a  ists (because.**
1b720 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
1b730 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
1b740 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63  rnal was never c
1b750 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20  reated) and the 
1b760 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77  transaction.** w
1b770 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63  ill not roll bac
1b780 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61  k - possibly lea
1b790 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ding to database
1b7a0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
1b7b0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1b7c0 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
1b7d0 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
1b7e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
1b7f0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1b800 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
1b810 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79    int isDataOnly
1b820 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45   = (flags&SQLITE
1b830 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b  _SYNC_DATAONLY);
1b840 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e  .  int isFullsyn
1b850 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29  c = (flags&0x0F)
1b860 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1b870 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  LL;..  /* Check 
1b880 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
1b890 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
1b8a0 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
1b8b0 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
1b8c0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1b8d0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
1b8e0 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
1b8f0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1b900 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f  C_FULL.  );..  /
1b910 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
1b920 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
1b930 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1b940 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
1b950 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
1b960 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
1b970 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
1b980 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
1b990 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
1b9a0 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
1b9b0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1b9c0 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73  TE_FULL );..  as
1b9d0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
1b9e0 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
1b9f0 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
1ba00 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66  e->h));.  rc = f
1ba10 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
1ba20 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20  >h, isFullsync, 
1ba30 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53  isDataOnly);.  S
1ba40 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1ba50 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1ba60 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
1ba70 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1ba80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  ;.    return uni
1ba90 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1baa0 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66  _IOERR_FSYNC, "f
1bab0 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c  ull_fsync", pFil
1bac0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
1bad0 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20    /* Also fsync 
1bae0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1baf0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c  ntaining the fil
1bb00 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e 43  e if the DIRSYNC
1bb10 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65   flag.  ** is se
1bb20 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e  t.  This is a on
1bb30 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 61 6e 63  e-time occurranc
1bb40 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73  e.  Many systems
1bb50 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29   (examples: AIX)
1bb60 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65  .  ** are unable
1bb70 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65   to fsync a dire
1bb80 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65  ctory, so ignore
1bb90 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66   errors on the f
1bba0 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sync..  */.  if(
1bbb0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1bbc0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52  s & UNIXFILE_DIR
1bbd0 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  SYNC ){.    int 
1bbe0 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41  dirfd;.    OSTRA
1bbf0 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73 20  CE(("DIRSYNC %s 
1bc00 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d  (have_fullfsync=
1bc10 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c  %d fullsync=%d)\
1bc20 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  n", pFile->zPath
1bc30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41  ,.            HA
1bc40 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73  VE_FULLFSYNC, is
1bc50 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20  Fullsync));.    
1bc60 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
1bc70 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74  tory(pFile->zPat
1bc80 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20  h, &dirfd);.    
1bc90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bca0 4b 20 26 26 20 64 69 72 66 64 3e 3d 30 20 29 7b  K && dirfd>=0 ){
1bcb0 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e  .      full_fsyn
1bcc0 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a  c(dirfd, 0, 0);.
1bcd0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
1bce0 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c  se(pFile, dirfd,
1bcf0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
1bd00 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1bd10 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
1bd20 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1bd30 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1bd40 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1bd50 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44  s &= ~UNIXFILE_D
1bd60 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65  IRSYNC;.  }.  re
1bd70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1bd80 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
1bd90 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
1bda0 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
1bdb0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
1bdc0 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
1bdd0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
1bde0 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
1bdf0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1be00 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
1be10 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
1be20 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
1be30 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1be40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1be50 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
1be60 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1be70 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1be80 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1be90 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
1bea0 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
1beb0 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
1bec0 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
1bed0 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
1bee0 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
1bef0 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
1bf00 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
1bf10 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
1bf20 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1bf30 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
1bf40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1bf50 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1bf60 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
1bf70 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
1bf80 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
1bf90 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1bfa0 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
1bfb0 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
1bfc0 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
1bfd0 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29  h, (off_t)nByte)
1bfe0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1bff0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1c000 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1c010 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1c020 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1c030 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
1c040 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
1c050 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
1c060 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1c070 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  BUG.    /* If we
1c080 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1c090 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1c0a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1c0b0 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20   opposed to.    
1c0c0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1c0d0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1c0e0 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1c0f0 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1c100 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d  an a.    ** norm
1c110 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1c120 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74  ) and we truncat
1c130 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1c140 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a  ro length,.    *
1c150 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65  * that effective
1c160 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1c170 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20  hange counter.  
1c180 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1c190 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65  n.    ** when re
1c1a0 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61  storing a databa
1c1b0 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63  se using the bac
1c1c0 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a  kup API from a z
1c1d0 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ero-length.    *
1c1e0 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f  * source..    */
1c1f0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
1c200 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
1c210 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
1c220 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
1c230 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
1c240 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
1c250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c260 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1c270 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
1c280 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
1c290 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
1c2a0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1c2b0 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
1c2c0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
1c2d0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1c2e0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1c2f0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
1c300 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  );.  rc = osFsta
1c310 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
1c320 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
1c330 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1c340 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1c350 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  !=0 ){.    ((uni
1c360 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
1c370 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1c380 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c390 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1c3a0 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
1c3b0 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
1c3c0 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
1c3d0 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
1c3e0 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65  e, the findInode
1c3f0 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65  Info() procedure
1c400 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73  .  ** writes a s
1c410 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20  ingle byte into 
1c420 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64  that file in ord
1c430 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  er to work aroun
1c440 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20  d a bug.  ** in 
1c450 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66  the OS-X msdos f
1c460 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f  ilesystem.  In o
1c470 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72  rder to avoid pr
1c480 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65  oblems with uppe
1c490 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77  r.  ** layers, w
1c4a0 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74  e need to report
1c4b0 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20   this file size 
1c4c0 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f  as zero even tho
1c4d0 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72  ugh it is.  ** r
1c4e0 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65  eally 1.   Ticke
1c4f0 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20  t #3260..  */.  
1c500 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20  if( *pSize==1 ) 
1c510 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20  *pSize = 0;...  
1c520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c530 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1c540 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c550 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1c560 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
1c570 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f   Handler for pro
1c580 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d  xy-locking file-
1c590 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20  control verbs.  
1c5a0 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e  Defined below in
1c5b0 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67   the.** proxying
1c5c0 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f   locking divisio
1c5d0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1c5e0 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1c5f0 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  l(sqlite3_file*,
1c600 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64  int,void*);.#end
1c610 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  if../* .** This 
1c620 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1c630 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
1c640 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1c650 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65  ZE_HINT .** file
1c660 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69  -control operati
1c670 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65  on.  Enlarge the
1c680 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79   database to nBy
1c690 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28  tes in size.** (
1c6a0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68  rounded up to th
1c6b0 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a  e next chunk-siz
1c6c0 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  e).  If the data
1c6d0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a  base is already.
1c6e0 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72  ** nBytes or lar
1c6f0 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ger, this routin
1c700 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1c710 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74  .static int fcnt
1c720 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69  lSizeHint(unixFi
1c730 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e  le *pFile, i64 n
1c740 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69  Byte){.  if( pFi
1c750 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
1c760 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20  .    i64 nSize; 
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c780 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66     /* Required f
1c790 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1c7a0 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c7c0 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65   Used to hold re
1c7d0 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66  turn values of f
1c7e0 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20  stat() */.   .  
1c7f0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46    if( osFstat(pF
1c800 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20  ile->h, &buf) ) 
1c810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1c820 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20  ERR_FSTAT;..    
1c830 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
1c840 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31  pFile->szChunk-1
1c850 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) / pFile->szChu
1c860 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1c870 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53  hunk;.    if( nS
1c880 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f  ize>(i64)buf.st_
1c890 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66  size ){..#if def
1c8a0 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
1c8b0 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
1c8c0 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1c8d0 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  TE.      /* The 
1c8e0 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61  code below is ha
1c8f0 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72  ndling the retur
1c900 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c  n value of osFal
1c910 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20  locate() .      
1c920 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f  ** correctly. po
1c930 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20  six_fallocate() 
1c940 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72  is defined to "r
1c950 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73  eturns zero on s
1c960 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a  uccess, .      *
1c970 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75  * or an error nu
1c980 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65  mber on  failure
1c990 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61  ". See the manpa
1c9a0 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  ge for details. 
1c9b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  */.      int err
1c9c0 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
1c9d0 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c      err = osFall
1c9e0 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ocate(pFile->h, 
1c9f0 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69  buf.st_size, nSi
1ca00 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  ze-buf.st_size);
1ca10 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65  .      }while( e
1ca20 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  rr==EINTR );.   
1ca30 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74     if( err ) ret
1ca40 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1ca50 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20  _WRITE;.#else.  
1ca60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53      /* If the OS
1ca70 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70   does not have p
1ca80 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1ca90 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74  , fake it. First
1caa0 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74   use.      ** ft
1cab0 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74  runcate() to set
1cac0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20   the file size, 
1cad0 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e  then write a sin
1cae0 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20  gle byte to.    
1caf0 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79    ** the last by
1cb00 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
1cb10 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65   within the exte
1cb20 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69  nded region. Thi
1cb30 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  s.      ** is th
1cb40 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65  e same technique
1cb50 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 74   used by glibc t
1cb60 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69  o implement posi
1cb70 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20  x_fallocate().  
1cb80 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d      ** on system
1cb90 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61  s that do not ha
1cba0 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63  ve a real falloc
1cbb0 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ate() system cal
1cbc0 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
1cbd0 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66    int nBlk = buf
1cbe0 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a  .st_blksize;  /*
1cbf0 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f   File-system blo
1cc00 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ck size */.     
1cc10 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20   i64 iWrite;    
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cc30 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77  Next offset to w
1cc40 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20  rite to */..    
1cc50 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1cc60 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1cc70 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20   nSize) ){.     
1cc80 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1cc90 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1cca0 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
1ccb0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1ccc0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1ccd0 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1cce0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1ccf0 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65    }.      iWrite
1cd00 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65   = ((buf.st_size
1cd10 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e   + 2*nBlk - 1)/n
1cd20 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20  Blk)*nBlk-1;.   
1cd30 20 20 20 77 68 69 6c 65 28 20 69 57 72 69 74 65     while( iWrite
1cd40 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  <nSize ){.      
1cd50 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73    int nWrite = s
1cd60 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1cd70 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31  e, iWrite, "", 1
1cd80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1cd90 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
1cda0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1cdb0 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57  RITE;.        iW
1cdc0 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20  rite += nBlk;.  
1cdd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1cde0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1cdf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1ce00 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1ce10 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67   inititially neg
1ce20 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
1ce30 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
1ce40 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
1ce50 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
1ce60 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1ce70 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
1ce80 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
1ce90 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
1cea0 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
1ceb0 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
1cec0 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
1ced0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1cee0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1cef0 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e  d unixModeBit(un
1cf00 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
1cf10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73  nsigned char mas
1cf20 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20  k, int *pArg){. 
1cf30 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a   if( *pArg<0 ){.
1cf40 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69      *pArg = (pFi
1cf50 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
1cf60 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  mask)!=0;.  }els
1cf70 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30  e if( (*pArg)==0
1cf80 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
1cf90 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73  trlFlags &= ~mas
1cfa0 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
1cfb0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1cfc0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a   |= mask;.  }.}.
1cfd0 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
1cfe0 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
1cff0 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
1d000 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
1d010 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
1d020 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
1d030 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
1d040 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e  oid *pArg){.  un
1d050 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1d060 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1d070 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1d080 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1d090 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
1d0a0 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1d0b0 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69  Arg = pFile->eFi
1d0c0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65  leLock;.      re
1d0d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d0e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1d0f0 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
1d100 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
1d110 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
1d120 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
1d130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d150 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
1d160 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
1d170 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
1d180 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
1d190 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d1a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1d1b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1d1c0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
1d1d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
1d1e0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1d1f0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1d200 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c        rc = fcntl
1d210 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20  SizeHint(pFile, 
1d220 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20  *(i64 *)pArg);. 
1d230 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1d240 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1d250 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d260 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1d270 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
1d280 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
1d290 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
1d2a0 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52  le, UNIXFILE_PER
1d2b0 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29  SIST_WAL, (int*)
1d2c0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
1d2d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d2e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1d2f0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
1d300 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
1d310 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
1d320 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
1d330 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
1d340 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
1d350 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d360 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1d370 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
1d380 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
1d390 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
1d3a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
1d3b0 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
1d3c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
1d3d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d3e0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1d3f0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1d400 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20  The pager calls 
1d410 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73  this method to s
1d420 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61  ignal that it ha
1d430 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20  s done.    ** a 
1d440 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61  rollback and tha
1d450 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  t the database i
1d460 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68  s therefore unch
1d470 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  anged and.    **
1d480 20 69 74 20 68 65 6e 63 65 20 69 74 20 69 73 20   it hence it is 
1d490 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73  OK for the trans
1d4a0 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f  action change co
1d4b0 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20  unter to be.    
1d4c0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  ** unchanged..  
1d4d0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1d4e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1d4f0 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20  CHANGED: {.     
1d500 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1d510 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
1d520 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d530 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65  ITE_OK;.    }.#e
1d540 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1d550 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d560 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1d570 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63  __APPLE__).    c
1d580 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  ase SQLITE_SET_L
1d590 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20  OCKPROXYFILE:.  
1d5a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45    case SQLITE_GE
1d5b0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1d5c0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1d5d0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1d5e0 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
1d5f0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1d600 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1d610 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1d620 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1d630 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1d640 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
1d650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1d660 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1d670 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
1d680 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
1d690 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
1d6a0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1d6b0 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
1d6c0 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
1d6d0 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
1d6e0 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
1d6f0 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
1d700 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
1d710 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
1d720 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
1d730 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
1d740 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
1d750 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
1d760 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
1d770 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
1d780 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
1d790 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
1d7a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
1d7b0 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
1d7c0 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
1d7d0 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
1d7e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e  .*/.#ifndef __QN
1d7f0 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69  XNTO__ .static i
1d800 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1d810 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1d820 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1d830 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1d840 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1d850 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1d860 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65  ECTOR_SIZE;.}.#e
1d870 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1d880 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f  following versio
1d890 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53  n of unixSectorS
1d8a0 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a  ize() is optimiz
1d8b0 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23  ed for QNX..*/.#
1d8c0 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  ifdef __QNXNTO__
1d8d0 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64  .#include <sys/d
1d8e0 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c  cmd_blk.h>.#incl
1d8f0 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73  ude <sys/statvfs
1d900 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .h>.static int u
1d910 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
1d920 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
1d930 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1d940 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1d950 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  id;.  if( pFile-
1d960 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30  >sectorSize == 0
1d970 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
1d980 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20  tatvfs fsInfo;. 
1d990 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65        .    /* Se
1d9a0 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e  t defaults for n
1d9b0 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c  on-supported fil
1d9c0 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20  esystems */.    
1d9d0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1d9e0 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
1d9f0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1da00 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1da10 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1da20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73   = 0;.    if( fs
1da30 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c  tatvfs(pFile->h,
1da40 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
1da50 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
1da60 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1da70 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ze;.    }..    i
1da80 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
1da90 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74  o.f_basetype, "t
1daa0 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70  mp") ) {.      p
1dab0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1dac0 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1dad0 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1dae0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1daf0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1db00 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1db10 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a  MIC4K |       /*
1db20 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73   All ram filesys
1db30 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61  tem writes are a
1db40 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
1db50 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
1db60 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
1db70 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
1db80 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
1db90 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1dbc0 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
1dbd0 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
1dbe0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1dbf0 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1dc00 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1dc10 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1dc20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1dc50 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1dc60 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1dc70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1dc80 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
1dc90 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29  etype, "etfs") )
1dca0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1dcb0 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1dcc0 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1dcd0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1dce0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1dcf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73  .        /* etfs
1dd00 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72   cluster size wr
1dd10 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
1dd20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c  */.        (pFil
1dd30 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
1dd40 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
1dd50 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a  AP_ATOMIC512) |.
1dd60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1dd70 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1dd80 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
1dd90 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1dda0 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
1dde0 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
1ddf0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1de00 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1de10 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1de20 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1de30 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1de70 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1de80 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
1de90 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
1dea0 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1deb0 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx6") ){.      
1dec0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1ded0 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1dee0 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1def0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1df00 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1df10 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1df20 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f  OMIC |         /
1df30 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d  * All filesystem
1df40 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
1df50 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
1df60 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1df70 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
1df80 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
1df90 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
1dfa0 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfc0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1dfd0 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
1dfe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1dff0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1e000 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1e010 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1e020 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1e030 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e050 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1e060 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1e070 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1e080 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d  }else if( !strcm
1e090 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
1e0a0 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a  ype, "qnx4") ){.
1e0b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1e0c0 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1e0d0 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1e0e0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1e0f0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1e100 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62         /* full b
1e110 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73  itset of atomics
1e120 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72   from max sector
1e130 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65   size and smalle
1e140 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70  r */.        ((p
1e150 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1e160 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
1e170 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
1e180 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20   << 1) - 2 |.   
1e190 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1e1a0 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1e1b0 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1e1c0 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1e1d0 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1e210 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1e220 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
1e230 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f  f( strstr(fsInfo
1e240 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f  .f_basetype, "do
1e250 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
1e260 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1e270 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1e280 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1e290 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1e2a0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
1e2b0 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20   full bitset of 
1e2c0 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78  atomics from max
1e2d0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64   sector size and
1e2e0 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
1e2f0 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63      ((pFile->sec
1e300 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
1e310 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1e320 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20  MIC512) << 1) - 
1e330 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  2 |.        SQLI
1e340 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1e350 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1e360 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1e370 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1e380 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1e3b0 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1e3c0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1e3d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
1e3e0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1e3f0 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1e400 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1e410 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20  _ATOMIC512 |    
1e420 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20    /* blocks are 
1e430 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
1e440 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1e450 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1e460 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1e470 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1e480 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1e4b0 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
1e4c0 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
1e4d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  0;.    }.  }.  /
1e4e0 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65  * Last chance ve
1e4f0 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20  rification.  If 
1e500 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1e510 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65  isn't a multiple
1e520 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65   of 512.  ** the
1e530 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64  n it isn't valid
1e540 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .*/.  if( pFile-
1e550 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31  >sectorSize % 51
1e560 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46  2 != 0 ){.    pF
1e570 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1e580 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
1e590 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1e5a0 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
1e5b0 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1e5c0 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
1e5d0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1e5e0 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
1e5f0 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f  __QNXNTO__ */../
1e600 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1e610 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1e620 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
1e630 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
1e640 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f  VFS is set up to
1e650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e660 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1e670 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61  VERWRITE by defa
1e680 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ult..** However,
1e690 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20   that choice is 
1e6a0 63 6f 6e 74 72 61 76 65 72 73 69 61 6c 20 73 69  contraversial si
1e6b0 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20  nce technically 
1e6c0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
1e6d0 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f  * file system do
1e6e0 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72  es not always pr
1e6f0 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20  ovide powersafe 
1e700 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e  overwrites.  (In
1e710 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
1e720 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c   after a power-l
1e730 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73  oss event, parts
1e740 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61   of the file tha
1e750 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20  t were never.** 
1e760 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e  written might en
1e770 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72  d up being alter
1e780 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e  ed.)  However, n
1e790 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72  on-PSOW behavior
1e7a0 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72   is very,.** ver
1e7b0 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73  y rare.  And ass
1e7c0 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65  erting PSOW make
1e7d0 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74  s a large reduct
1e7e0 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e  ion in the amoun
1e7f0 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64  t.** of required
1e800 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c   I/O for journal
1e810 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74  ing, since a lot
1e820 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65   of padding is e
1e830 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48  liminated..**  H
1e840 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45  ence, while POWE
1e850 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1e860 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
1e870 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c  , there is a fil
1e880 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61  e-control.** ava
1e890 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
1e8a0 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75  t off and URI qu
1e8b0 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76  ery parameter av
1e8c0 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
1e8d0 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  it off..*/.stati
1e8e0 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
1e8f0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1e900 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1e910 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1e920 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1e930 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
1e940 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  #ifdef __QNXNTO_
1e950 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f  _.  if( p->secto
1e960 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53  rSize==0 ) unixS
1e970 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20  ectorSize(id);. 
1e980 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43   rc = p->deviceC
1e990 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a  haracteristics;.
1e9a0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
1e9b0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1e9c0 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20  FILE_PSOW ){.   
1e9d0 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f   rc |= SQLITE_IO
1e9e0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1e9f0 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72  ERWRITE;.  }.  r
1ea00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1ea10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ea20 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  _WAL.../*.** Obj
1ea30 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
1ea40 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
1ea50 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
1ea60 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
1ea70 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
1ea80 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
1ea90 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
1eaa0 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
1eab0 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
1eac0 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
1ead0 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
1eae0 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
1eaf0 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
1eb00 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
1eb10 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1eb20 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
1eb30 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
1eb40 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
1eb50 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
1eb60 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1eb70 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
1eb80 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
1eb90 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
1eba0 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
1ebb0 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
1ebc0 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
1ebd0 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
1ebe0 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
1ebf0 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
1ec00 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
1ec10 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
1ec20 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
1ec30 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
1ec40 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
1ec50 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
1ec60 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
1ec70 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
1ec80 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1ec90 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
1eca0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
1ecb0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1ecc0 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
1ecd0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1ece0 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
1ecf0 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
1ed00 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
1ed10 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
1ed20 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
1ed30 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
1ed40 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
1ed50 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
1ed60 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
1ed70 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
1ed80 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
1ed90 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1eda0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
1edb0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
1edc0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
1edd0 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
1ede0 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
1edf0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
1ee00 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
1ee10 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
1ee20 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
1ee30 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
1ee40 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
1ee50 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
1ee60 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1ee70 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
1ee80 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
1ee90 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
1eea0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
1eeb0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
1eec0 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
1eed0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
1eee0 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
1eef0 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
1ef00 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
1ef10 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
1ef20 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
1ef30 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
1ef40 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
1ef50 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1ef60 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
1ef70 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef90 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
1efa0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
1efb0 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
1efc0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1efd0 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
1efe0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
1eff0 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
1f000 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1f010 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
1f020 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
1f030 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
1f040 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
1f050 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
1f060 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
1f070 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
1f080 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
1f090 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1f0a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
1f0d0 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
1f0e0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
1f0f0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
1f100 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
1f110 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
1f120 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
1f130 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
1f140 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1f150 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
1f160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1f170 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1f180 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1f190 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
1f1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1f1b0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1f1c0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
1f1d0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
1f1e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1f1f0 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
1f200 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
1f210 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
1f220 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
1f230 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
1f240 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
1f250 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
1f260 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
1f270 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
1f280 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1f290 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1f2a0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
1f2b0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
1f2c0 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
1f2d0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
1f2e0 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
1f2f0 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
1f300 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
1f310 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
1f320 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1f330 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
1f340 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
1f350 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
1f360 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
1f370 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
1f380 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
1f390 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
1f3a0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1f3b0 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
1f3c0 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
1f3d0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
1f3e0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
1f3f0 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
1f400 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
1f410 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
1f420 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
1f430 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
1f440 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f450 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
1f460 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
1f470 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20  x */.  u8 id;   
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f490 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
1f4a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
1f4b0 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
1f4c0 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  e */.  u16 share
1f4d0 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1f4e0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1f4f0 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1f500 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
1f510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1f520 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
1f530 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
1f540 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  /.};../*.** Cons
1f550 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
1f560 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
1f570 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
1f580 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
1f590 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
1f5a0 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
1f5b0 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
1f5c0 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
1f5d0 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
1f5e0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
1f5f0 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
1f600 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
1f610 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
1f620 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
1f630 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
1f640 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
1f650 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
1f660 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
1f670 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
1f680 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
1f690 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
1f6a0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1f6b0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1f6c0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
1f6d0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1f6e0 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c  Node, /* Apply l
1f6f0 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
1f700 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
1f710 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
1f720 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
1f730 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
1f740 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
1f750 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
1f760 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1f770 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
1f780 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1f790 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f7b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1f7c0 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
1f7d0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66    struct flock f
1f7e0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
1f7f0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
1f800 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
1f810 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1f820 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65  LITE_OK;   /* Re
1f830 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
1f840 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
1f850 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
1f860 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1f870 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
1f880 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
1f890 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f8a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68  3_mutex_held(pSh
1f8b0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  mNode->mutex) ||
1f8c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
1f8d0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72  =0 );..  /* Shar
1f8e0 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73  ed locks never s
1f8f0 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  pan more than on
1f900 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65  e byte */.  asse
1f910 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b  rt( n==1 || lock
1f920 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b  Type!=F_RDLCK );
1f930 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65  ..  /* Locks are
1f940 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f   within range */
1f950 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
1f960 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f  && n<SQLITE_SHM_
1f970 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  NLOCK );..  if( 
1f980 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
1f990 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
1f9a0 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
1f9b0 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1f9c0 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20    memset(&f, 0, 
1f9d0 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20  sizeof(f));.    
1f9e0 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54  f.l_type = lockT
1f9f0 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65  ype;.    f.l_whe
1fa00 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
1fa10 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20      f.l_start = 
1fa20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65  ofst;.    f.l_le
1fa30 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d  n = n;..    rc =
1fa40 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64   osFcntl(pShmNod
1fa50 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
1fa60 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  f);.    rc = (rc
1fa70 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
1fa80 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
1fa90 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  Y;.  }..  /* Upd
1faa0 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  ate the global l
1fab0 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f  ock state and do
1fac0 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a   debug tracing *
1fad0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1fae0 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61  DEBUG.  { u16 ma
1faf0 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  sk;.  OSTRACE(("
1fb00 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20  SHM-LOCK "));.  
1fb10 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
1fb20 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
1fb30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1fb40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1fb50 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
1fb60 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
1fb70 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
1fb80 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1fb90 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1fba0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1fbb0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1fbc0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
1fbd0 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ask;.    }else i
1fbe0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
1fbf0 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
1fc00 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
1fc10 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
1fc20 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1fc30 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
1fc40 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
1fc50 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
1fc60 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  |= mask;.    }el
1fc70 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1fc80 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
1fc90 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
1fca0 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
1fcb0 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
1fcc0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1fcd0 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
1fce0 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
1fcf0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
1fd00 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  = ~mask;.    }. 
1fd10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1fd20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
1fd30 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
1fd40 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66  CE(("unlock %d f
1fd50 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
1fd60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
1fd70 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
1fd80 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1fd90 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69  (("read-lock fai
1fda0 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73  led"));.    }els
1fdb0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1fdc0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c   lockType==F_WRL
1fdd0 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
1fde0 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
1fdf0 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
1fe00 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
1fe10 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61 66   OSTRACE((" - af
1fe20 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25 30  terwards %03x,%0
1fe30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
1fe40 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
1fe50 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65  edMask, pShmNode
1fe60 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
1fe70 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
1fe80 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d  rn rc;        .}
1fe90 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  .../*.** Purge t
1fea0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69  he unixShmNodeLi
1feb0 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
1fec0 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78  ntries with unix
1fed0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
1fee0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
1fef0 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
1ff00 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
1ff10 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
1ff20 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
1ff30 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
1ff40 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
1ff50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1ff60 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78  nixShmPurge(unix
1ff70 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e  File *pFd){.  un
1ff80 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70  ixShmNode *p = p
1ff90 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
1ffa0 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
1ffb0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
1ffc0 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
1ffd0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1ffe0 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72  int i;.    asser
1fff0 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46  t( p->pInode==pF
20000 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  d->pInode );.   
20010 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
20020 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
20030 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
20040 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  >nRegion; i++){.
20050 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d        if( p->h>=
20060 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 75 6e  0 ){.        mun
20070 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  map(p->apRegion[
20080 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29  i], p->szRegion)
20090 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
200a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
200b0 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  ree(p->apRegion[
200c0 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
200d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
200e0 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29  ree(p->apRegion)
200f0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d  ;.    if( p->h>=
20100 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
20110 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e  t_close(pFd, p->
20120 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
20130 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20      p->h = -1;. 
20140 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f     }.    p->pIno
20150 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de->pShmNode = 0
20160 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
20170 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
20180 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65  .** Open a share
20190 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
201a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70  sociated with op
201b0 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
201c0 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69   pDbFd.  .** Thi
201d0 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70  s particular imp
201e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
201f0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a   mmapped files..
20200 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75  **.** The file u
20210 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
20220 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
20230 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
20240 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68  rectory.** as th
20250 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
20260 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65  file and has the
20270 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
20280 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
20290 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ** file with the
202a0 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61   "-shm" suffix a
202b0 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70  dded.  For examp
202c0 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  le, if the datab
202d0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22  ase file.** is "
202e0 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
202f0 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20  ig.db" then the 
20300 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65  file that is cre
20310 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ated and mmapped
20320 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d  .** for shared m
20330 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61  emory will be ca
20340 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72  lled "/home/user
20350 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22  1/config.db-shm"
20360 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65  .  .**.** Anothe
20370 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73  r approach to is
20380 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e   to use files in
20390 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65   /dev/shm or /de
203a0 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73  v/tmp or an.** s
203b0 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20  ome other tmpfs 
203c0 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20  mount. But if a 
203d0 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72  file in a differ
203e0 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ent directory.**
203f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20400 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c  se file is used,
20410 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20   then differing 
20420 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
20430 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f  ns.** or a chroo
20440 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20  t() might cause 
20450 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72  two different pr
20460 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73  ocesses on the s
20470 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ame.** database 
20480 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20  to end up using 
20490 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20  different files 
204a0 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
204b0 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20  y - .** meaning 
204c0 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72  that their memor
204d0 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c  y would not real
204e0 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72  ly be shared - r
204f0 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64  esulting.** in d
20500 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
20510 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  on.  Nevertheles
20520 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69  s, this tmpfs fi
20530 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20  le usage.** can 
20540 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  be enabled at co
20550 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
20560 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49   -DSQLITE_SHM_DI
20570 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68  RECTORY="/dev/sh
20580 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75  m".** or the equ
20590 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73  ivalent.  The us
205a0 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
205b0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
205c0 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70  mpile-time.** op
205d0 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  tion results in 
205e0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
205f0 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b  build of SQLite;
20600 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69    builds of SQLi
20610 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20  te.** that with 
20620 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45  differing SQLITE
20630 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73  _SHM_DIRECTORY s
20640 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20  ettings attempt 
20650 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  to use the.** sa
20660 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
20670 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
20680 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  e, database corr
20690 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65  uption will like
206a0 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68  ly.** result. Th
206b0 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
206c0 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
206d0 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f  ime option is co
206e0 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73  nsidered.** "uns
206f0 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61  upported" and ma
20700 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66  y go away in a f
20710 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c  uture SQLite rel
20720 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ease..**.** When
20730 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
20740 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
20750 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
20760 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
20770 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
20780 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
20790 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
207a0 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
207b0 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
207c0 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
207d0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
207e0 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
207f0 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
20800 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
20810 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
20820 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73   file (pDbFd) is
20830 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78   using the "unix
20840 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68  -excl" VFS.** th
20850 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  at means that an
20860 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
20870 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
20880 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
20890 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  .** that no othe
208a0 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20  r processes are 
208b0 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20  able to read or 
208c0 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61  write the databa
208d0 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20  se.  In.** that 
208e0 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20  case, we do not 
208f0 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72  really need shar
20900 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73  ed memory.  No s
20910 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  hared memory.** 
20920 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e  file is created.
20930 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d    The shared mem
20940 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75  ory will be simu
20950 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20  lated with heap 
20960 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
20970 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68  c int unixOpenSh
20980 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
20990 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
209a0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70  truct unixShm *p
209b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
209c0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
209d0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
209e0 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
209f0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
20a00 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
20a10 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
20a20 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a40 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
20a50 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49   code */.  unixI
20a60 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
20a70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
20a80 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f  e inode of fd */
20a90 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c  .  char *zShmFil
20aa0 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
20ab0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
20ac0 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
20ad0 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  SHM */.  int nSh
20ae0 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  mFilename;      
20af0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
20b00 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65   of the SHM file
20b10 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
20b20 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
20b30 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
20b40 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  w unixShm object
20b50 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  . */.  p = sqlit
20b60 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
20b70 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
20b80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
20b90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
20ba0 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
20bb0 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (*p));.  assert(
20bc0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
20bd0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
20be0 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53  o see if a unixS
20bf0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c  hmNode object al
20c00 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65  ready exists. Re
20c10 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
20c20 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73    ** one if pres
20c30 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65  ent. Create a ne
20c40 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
20c50 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ry..  */.  unixE
20c60 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
20c70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
20c80 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64  Inode;.  pShmNod
20c90 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  e = pInode->pShm
20ca0 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d  Node;.  if( pShm
20cb0 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Node==0 ){.    s
20cc0 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
20cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20ce0 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66    /* fstat() inf
20cf0 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  o for database f
20d00 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  ile */..    /* C
20d10 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66  all fstat() to f
20d20 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65  igure out the pe
20d30 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
20d40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
20d50 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20  If.    ** a new 
20d60 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72  *-shm file is cr
20d70 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70  eated, an attemp
20d80 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  t will be made t
20d90 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20  o create it.    
20da0 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
20db0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20   permissions..  
20dc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
20dd0 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
20de0 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65  sStat) && pInode
20df0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
20e00 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
20e10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
20e20 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
20e30 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
20e40 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
20e50 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
20e60 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
20e70 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45   = sizeof(SQLITE
20e80 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20  _SHM_DIRECTORY) 
20e90 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  + 31;.#else.    
20ea0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36  nShmFilename = 6
20eb0 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70   + (int)strlen(p
20ec0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65  DbFd->zPath);.#e
20ed0 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
20ee0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
20ef0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  oc( sizeof(*pShm
20f00 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65  Node) + nShmFile
20f10 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20  name );.    if( 
20f20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20  pShmNode==0 ){. 
20f30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20f40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
20f50 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
20f60 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
20f70 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73  t(pShmNode, 0, s
20f80 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
20f90 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a  +nShmFilename);.
20fa0 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65      zShmFilename
20fb0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
20fc0 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
20fd0 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
20fe0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
20ff0 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
21000 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
21010 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
21020 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  mFilename, .    
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21040 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
21050 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73  CTORY "/sqlite-s
21060 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20  hm-%x-%x",.     
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u32)sStat.st_in
21090 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74  o, (u32)sStat.st
210a0 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20  _dev);.#else.   
210b0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
210c0 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
210d0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25  zShmFilename, "%
210e0 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
210f0 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
21100 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
21110 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d  bFd->zPath, zShm
21120 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
21130 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  f.    pShmNode->
21140 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46  h = -1;.    pDbF
21150 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
21160 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
21170 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49      pShmNode->pI
21180 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
21190 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  node;.    pShmNo
211a0 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
211b0 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
211c0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
211d0 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
211e0 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
211f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
21200 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
21210 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
21220 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
21230 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
21240 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
21250 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67      int openFlag
21260 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
21270 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20  REAT;.      if( 
21280 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
21290 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ean(pDbFd->zPath
212a0 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22  , "readonly_shm"
212b0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
212c0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
212d0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53  ONLY;.        pS
212e0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
212f0 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ly = 1;.      }.
21300 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21310 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  h = robust_open(
21320 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70  zShmFilename, op
21330 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e  enFlags, (sStat.
21340 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a  st_mode&0777));.
21350 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
21360 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
21370 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
21380 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
21390 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
213a0 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
213b0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
213c0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
213d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
213e0 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  f this process i
213f0 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  s running as roo
21400 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  t, make sure tha
21410 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20  t the SHM file. 
21420 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64       ** is owned
21430 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65   by the same use
21440 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20  r that owns the 
21450 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
21460 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  e.  Otherwise,. 
21470 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
21480 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20  inal owner will 
21490 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63  not be able to c
214a0 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f  onnect..      */
214b0 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28  .      osFchown(
214c0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74  pShmNode->h, sSt
214d0 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74  at.st_uid, sStat
214e0 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20  .st_gid);.  .   
214f0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
21500 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72  ee if another pr
21510 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
21520 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77   the dead-man sw
21530 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49  itch..      ** I
21540 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
21550 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
21560 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20   length. .      
21570 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
21580 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
21590 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  f( unixShmSystem
215a0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
215b0 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
215c0 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
215d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
215e0 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
215f0 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
21600 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
21610 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
21620 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
21630 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63  SHMOPEN, "ftrunc
21640 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  ate", zShmFilena
21650 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
21660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21680 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
21690 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
216a0 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
216b0 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
216c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
216d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
216e0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
216f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
21700 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e  Make the new con
21710 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20  nection a child 
21720 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  of the unixShmNo
21730 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e  de */.  p->pShmN
21740 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
21750 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
21760 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53  BUG.  p->id = pS
21770 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49  hmNode->nextShmI
21780 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53  d++;.#endif.  pS
21790 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  hmNode->nRef++;.
217a0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
217b0 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  p;.  unixLeaveMu
217c0 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
217d0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
217e0 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
217f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
21800 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
21810 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
21820 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  f the unixEnterM
21830 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
21840 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
21850 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
21860 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20  struct unixShm) 
21870 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53  object to the pS
21880 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20  hmNode has been 
21890 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  set. All that is
218a0 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f  .  ** left to do
218b0 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20   is to link the 
218c0 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  new object into 
218d0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
218e0 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
218f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
21900 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  t. This must be 
21910 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69  done while holdi
21920 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d  ng the pShmNode-
21930 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74  >mutex .  ** mut
21940 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
21950 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
21960 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
21970 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
21980 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
21990 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
219a0 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  st = p;.  sqlite
219b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
219c0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
219d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
219e0 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
219f0 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
21a00 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
21a10 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65  :.  unixShmPurge
21a20 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f  (pDbFd);       /
21a30 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
21a40 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
21a50 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
21a60 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75  te3_free(p);.  u
21a70 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
21a80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21a90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
21aa0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
21ab0 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
21ac0 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
21ad0 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  gion of the .** 
21ae0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
21af0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
21b00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21b10 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
21b20 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72  y regions .** ar
21b30 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
21b40 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
21b50 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
21b60 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
21b70 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69  gion .** bytes i
21b80 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
21b90 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21ba0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
21bb0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
21bc0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
21bd0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
21be0 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74  ise, if the bExt
21bf0 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  end parameter is
21c00 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
21c10 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
21c20 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
21c30 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
21c40 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
21c50 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
21c60 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
21c70 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
21c80 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
21c90 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
21ca0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
21cb0 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74  ned. If .** bExt
21cc0 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  end is non-zero 
21cd0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
21ce0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
21cf0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
21d00 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  et .** been allo
21d10 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
21d20 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
21d30 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
21d40 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
21d50 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
21d60 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
21d70 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
21d80 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
21d90 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
21da0 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
21db0 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
21dc0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
21dd0 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
21de0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
21df0 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
21e00 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
21e10 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20   the mapped .** 
21e20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
21e30 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
21e40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
21e50 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  xShmMap(.  sqlit
21e60 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
21e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
21e80 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
21e90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
21ea0 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ec0 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
21ed0 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
21ee0 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
21ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
21f00 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
21f10 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20  .  int bExtend, 
21f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f30 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
21f40 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
21f50 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
21f60 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
21f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
21f80 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
21f90 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  y */.){.  unixFi
21fa0 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
21fb0 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69  xFile*)fd;.  uni
21fc0 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53  xShm *p;.  unixS
21fd0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
21fe0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
21ff0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
22000 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
22010 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  ry file has not 
22020 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
22030 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
22040 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53  .  if( pDbFd->pS
22050 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  hm==0 ){.    rc 
22060 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  = unixOpenShared
22070 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
22080 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22090 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
220a0 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62  ;.  }..  p = pDb
220b0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d  Fd->pShm;.  pShm
220c0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
220d0 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
220e0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
220f0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
22100 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
22110 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
22120 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
22130 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  nRegion==0 );.  
22140 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
22150 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
22160 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
22170 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
22180 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
22190 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
221a0 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
221b0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
221c0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
221d0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
221e0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
221f0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
22200 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63  iRegion ){.    c
22210 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20  har **apNew;    
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22230 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f    /* New apRegio
22240 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
22250 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
22260 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
22270 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
22280 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
22290 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
222a0 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
222b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
222c0 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a  sed by fstat() *
222d0 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
222e0 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
222f0 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70  gion;..    if( p
22300 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
22310 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
22320 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
22330 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
22340 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
22350 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
22360 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74        ** Check t
22370 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
22380 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
22390 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
223a0 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
223b0 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
223c0 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
223d0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
223e0 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ion)..      */. 
223f0 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
22400 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73  (pShmNode->h, &s
22410 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stat) ){.       
22420 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
22430 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20  RR_SHMSIZE;.    
22440 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
22450 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
22460 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61 74  .      if( sStat
22470 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29  .st_size<nByte )
22480 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
22490 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
224a0 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
224b0 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78 74  t exist. If bExt
224c0 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20  end is set to.  
224d0 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20        ** false, 
224e0 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
224f0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
22500 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
22510 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
22520 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
22530 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
22540 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74   if bExtend is t
22550 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e 63 61  rue, use ftrunca
22560 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
22570 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
22580 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
22590 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20   region..       
225a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
225b0 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74 6f 20  !bExtend ) goto 
225c0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 23 69 66  shmpage_out;.#if
225d0 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
225e0 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
225f0 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
22600 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 20 20 69  LOCATE.        i
22610 66 28 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70  f( osFallocate(p
22620 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61  ShmNode->h, sSta
22630 74 2e 73 74 5f 73 69 7a 65 2c 20 6e 42 79 74 65  t.st_size, nByte
22640 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
22650 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
22660 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
22670 5f 53 48 4d 53 49 5a 45 2c 20 22 66 61 6c 6c 6f  _SHMSIZE, "fallo
22680 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20 20 20  cate",.         
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69     pShmNode->zFi
226b0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
226c0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
226d0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  out;.        }.#
226e0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
226f0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
22700 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e  e(pShmNode->h, n
22710 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Byte) ){.       
22720 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
22730 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
22740 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74 72 75  R_SHMSIZE, "ftru
22750 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20 20  ncate",.        
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22770 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
22780 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
22790 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
227a0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
227b0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
227c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70     }..    /* Map
227d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
227e0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74  emory region int
227f0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
22800 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
22810 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28  */.    apNew = (
22820 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f  char **)sqlite3_
22830 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
22840 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
22850 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29  ion, (iRegion+1)
22860 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a  *sizeof(char *).
22870 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
22880 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
22890 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
228a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
228b0 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
228c0 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f      }.    pShmNo
228d0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61  de->apRegion = a
228e0 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28  pNew;.    while(
228f0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
22900 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20  n<=iRegion){.   
22910 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20     void *pMem;. 
22920 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
22930 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
22940 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30     pMem = mmap(0
22950 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20  , szRegion,.    
22960 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
22970 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50  ->isReadonly ? P
22980 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f  ROT_READ : PROT_
22990 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c  READ|PROT_WRITE,
229a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41   .            MA
229b0 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f  P_SHARED, pShmNo
229c0 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a  de->h, szRegion*
229d0 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e  (i64)pShmNode->n
229e0 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29  Region.        )
229f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
22a00 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  em==MAP_FAILED )
22a10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
22a20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
22a30 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
22a40 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e  P, "mmap", pShmN
22a50 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
22a60 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
22a70 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
22a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
22a90 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
22aa0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
22ab0 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  c(szRegion);.   
22ac0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30       if( pMem==0
22ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
22ae0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
22af0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
22b00 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
22b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
22b20 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73  emset(pMem, 0, s
22b30 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
22b40 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  }.      pShmNode
22b50 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  ->apRegion[pShmN
22b60 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20  ode->nRegion] = 
22b70 70 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d  pMem;.      pShm
22b80 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b  Node->nRegion++;
22b90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70  .    }.  }..shmp
22ba0 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
22bb0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
22bc0 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  >iRegion ){.    
22bd0 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  *pp = pShmNode->
22be0 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  apRegion[iRegion
22bf0 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
22c00 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  *pp = 0;.  }.  i
22c10 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52  f( pShmNode->isR
22c20 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53  eadonly && rc==S
22c30 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
22c40 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
22c50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
22c60 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
22c70 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
22c80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
22c90 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
22ca0 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
22cb0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
22cc0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
22cd0 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68  t the relationsh
22ce0 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45  ip between SHARE
22cf0 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20  d and EXCLUSIVE 
22d00 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c  locks is a littl
22d10 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68  e.** different h
22d20 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69  ere than in posi
22d30 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28  x.  In xShmLock(
22d40 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72  ), one can go fr
22d50 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74  om unlocked.** t
22d60 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63  o shared and bac
22d70 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  k or from unlock
22d80 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
22d90 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f  and back.  But o
22da0 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f  ne may.** not go
22db0 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20   from shared to 
22dc0 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f  exclusive or fro
22dd0 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73  m exclusive to s
22de0 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  hared..*/.static
22df0 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b   int unixShmLock
22e00 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
22e10 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
22e20 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
22e30 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
22e40 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
22e50 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
22e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
22e70 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69  st lock to acqui
22e80 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
22e90 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22eb0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
22ec0 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
22ed0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
22ee0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
22ef0 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
22f00 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f  o do with the lo
22f10 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ck */.){.  unixF
22f20 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
22f30 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  ixFile*)fd;     
22f40 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
22f50 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
22f60 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68  mory */.  unixSh
22f70 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
22f80 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
22f90 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  /* The shared me
22fa0 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65  mory being locke
22fb0 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  d */.  unixShm *
22fc0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22fe0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
22ff0 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f   all siblings */
23000 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
23010 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
23020 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20  hmNode;  /* The 
23030 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20  underlying file 
23040 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72  iNode */.  int r
23050 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23070 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
23080 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
230b0 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
230c0 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
230d0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  /..  assert( pSh
230e0 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  mNode==pDbFd->pI
230f0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29  node->pShmNode )
23100 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
23110 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
23120 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
23130 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30   assert( ofst>=0
23140 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49   && ofst+n<=SQLI
23150 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
23160 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29    assert( n>=1 )
23170 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
23180 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
23190 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
231a0 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
231b0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
231c0 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
231d0 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
231e0 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  E).       || fla
231f0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
23200 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
23210 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
23220 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
23230 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
23240 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
23250 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73  LUSIVE) );.  ass
23260 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c  ert( n==1 || (fl
23270 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
23280 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29  _EXCLUSIVE)!=0 )
23290 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
232a0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44  Node->h>=0 || pD
232b0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
232c0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  ocessLock==1 );.
232d0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
232e0 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64  de->h<0 || pDbFd
232f0 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
23300 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20  ssLock==0 );..  
23310 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
23320 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
23330 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20  ;.  assert( n>1 
23340 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73  || mask==(1<<ofs
23350 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t) );.  sqlite3_
23360 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
23370 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
23380 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
23390 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
233a0 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
233b0 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
233c0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
233d0 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
233e0 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
233f0 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
23400 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
23410 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
23420 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
23430 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
23440 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
23450 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23460 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
23470 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
23480 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
23490 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
234a0 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
234b0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
234c0 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
234d0 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
234e0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
234f0 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
23500 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
23510 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
23520 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
23530 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_UNLCK, ofst+U
23540 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
23550 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23560 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23570 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
23580 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
23590 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
235a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
235b0 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
235c0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
235d0 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
235e0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
235f0 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  } .  }else if( f
23600 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
23610 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
23620 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
23630 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
23640 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
23650 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
23660 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
23670 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
23680 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
23690 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
236a0 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
236b0 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
236c0 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
236d0 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
236e0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
236f0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
23700 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
23710 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
23720 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
23730 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
23740 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
23750 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
23760 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
23770 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
23780 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
23790 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
237a0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
237b0 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
237c0 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
237d0 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
237e0 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
237f0 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
23800 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
23810 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
23830 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
23840 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
23850 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
23860 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
23870 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
23880 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
23890 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
238a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
238b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
238c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
238d0 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
238e0 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
238f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23900 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
23910 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
23920 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
23930 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
23940 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
23950 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
23960 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
23970 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
23980 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
23990 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
239a0 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
239b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
239c0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
239d0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
239e0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
239f0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
23a00 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
23a10 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
23a20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
23a30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23a40 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
23a50 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
23a60 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
23a70 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
23a80 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
23a90 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
23aa0 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
23ab0 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
23ac0 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
23ad0 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
23ae0 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
23af0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23b00 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
23b10 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
23b20 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52  k(pShmNode, F_WR
23b30 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
23b40 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
23b50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23b60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23b70 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
23b80 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
23b90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
23ba0 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
23bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23bc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
23bd0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
23be0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
23bf0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
23c00 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
23c10 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c  d got %03x,%03x\
23c20 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
23c30 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20  ->id, getpid(), 
23c40 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
23c50 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
23c60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23c70 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
23c80 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
23c90 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
23ca0 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
23cb0 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
23cc0 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
23cd0 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
23ce0 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
23cf0 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
23d00 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
23d10 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
23d20 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
23d30 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
23d40 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
23d50 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
23d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
23d70 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
23d80 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
23d90 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
23da0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
23db0 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d);.  unixEnterM
23dc0 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65  utex();.  unixLe
23dd0 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
23de0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e  *.** Close a con
23df0 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
23e00 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74  d-memory.  Delet
23e10 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
23e20 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20   .** storage if 
23e30 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72  deleteFlag is tr
23e40 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
23e50 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20  re is no shared 
23e60 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
23e70 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65  d with the conne
23e80 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a  ction then this.
23e90 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  ** routine is a 
23ea0 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a  harmless no-op..
23eb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
23ec0 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71  ixShmUnmap(.  sq
23ed0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23ef0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
23f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
23f10 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
23f20 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
23f30 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61     /* Delete sha
23f40 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72  red-memory if tr
23f50 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  ue */.){.  unixS
23f60 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
23f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23f80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
23f90 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75  be closed */.  u
23fa0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
23fb0 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
23fc0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
23fd0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
23fe0 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ile */.  unixShm
23ff0 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
24000 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
24010 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
24020 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
24030 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
24040 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20  pDbFd;          
24050 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
24060 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
24070 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46   file */..  pDbF
24080 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
24090 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
240a0 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
240b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
240c0 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
240d0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
240e0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
240f0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
24100 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
24110 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
24120 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
24130 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f  ->pInode );..  /
24140 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74  * Remove connect
24150 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73  ion p from the s
24160 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  et of connection
24170 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a  s associated.  *
24180 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20  * with pShmNode 
24190 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
241a0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
241b0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72  e->mutex);.  for
241c0 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70  (pp=&pShmNode->p
241d0 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b  First; (*pp)!=p;
241e0 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e   pp = &(*pp)->pN
241f0 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70  ext){}.  *pp = p
24200 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46  ->pNext;..  /* F
24210 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ree the connecti
24220 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  on p */.  sqlite
24230 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62  3_free(p);.  pDb
24240 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20  Fd->pShm = 0;.  
24250 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
24260 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
24270 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  tex);..  /* If p
24280 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61  ShmNode->nRef ha
24290 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65  s reached 0, the
242a0 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65  n close the unde
242b0 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72  rlying.  ** shar
242c0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
242d0 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  too */.  unixEnt
242e0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
242f0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
24300 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
24310 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
24320 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
24330 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f==0 ){.    if( 
24340 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53  deleteFlag && pS
24350 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f  hmNode->h>=0 ) o
24360 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65  sUnlink(pShmNode
24370 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
24380 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
24390 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  DbFd);.  }.  uni
243a0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
243b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
243c0 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20  OK;.}...#else.# 
243d0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61  define unixShmMa
243e0 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
243f0 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20   unixShmLock    
24400 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
24410 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
24420 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61  fine unixShmUnma
24430 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
24440 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24450 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
24460 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
24470 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
24480 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
24490 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
244a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244b0 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
244c0 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
244d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
244f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
24540 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  /*.** This divis
24550 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  ion contains def
24560 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69  initions of sqli
24570 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
24580 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69  bjects that.** i
24590 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73  mplement various
245a0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74   file locking st
245b0 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c  rategies.  It al
245c0 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  so contains defi
245d0 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66  nitions.** of "f
245e0 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
245f0 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63  .  A finder-func
24600 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
24610 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f  locate the appro
24620 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65  priate.** sqlite
24630 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
24640 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63  ect for a partic
24650 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69  ular database fi
24660 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74  le.  The pAppDat
24670 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  a.** field of th
24680 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46  e sqlite3_vfs VF
24690 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e  S objects are in
246a0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20  itialized to be 
246b0 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74  pointers to.** t
246c0 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65  he correct finde
246d0 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74  r-function for t
246e0 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d  hat VFS..**.** M
246f0 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74  ost finder funct
24700 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f  ions return a po
24710 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
24720 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
24730 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20  ods.** object.  
24740 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73  The only interes
24750 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63  ting finder-func
24760 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b  tion is autolock
24770 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a  IoFinder, which.
24780 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  ** looks at the 
24790 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  filesystem type 
247a0 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65  and tries to gue
247b0 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ss the best lock
247c0 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20  ing.** strategy 
247d0 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a  from that..**.**
247e0 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74   For finder-funt
247f0 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63  ion F, two objec
24800 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a  ts are created:.
24810 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65  **.**    (1) The
24820 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e   real finder-fun
24830 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d  ction named "FIm
24840 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  pt()"..**.**    
24850 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70  (2) A constant p
24860 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66  ointer to this f
24870 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75  unction named ju
24880 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  st "F"..**.**.**
24890 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
248a0 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75  e F pointer is u
248b0 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44  sed as the pAppD
248c0 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46  ata value for VF
248d0 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57  S.** objects.  W
248e0 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69  e have to do thi
248f0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74  s instead of let
24900 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f  ting pAppData po
24910 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20  int.** directly 
24920 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75  at the finder-fu
24930 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30  nction since C90
24940 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61   rules prevent a
24950 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62   void*.** from b
24960 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75  e cast into a fu
24970 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a  nction pointer..
24980 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  **.**.** Each in
24990 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d  stance of this m
249a0 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74  acro generates t
249b0 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a  wo objects:.**.*
249c0 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e  *   *  A constan
249d0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
249e0 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c  hods object call
249f0 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73   METHOD that has
24a00 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
24a10 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20   methods CLOSE, 
24a20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
24a30 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20  RESLOCK..**.**  
24a40 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f   *  An I/O metho
24a50 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
24a60 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20  n called FINDER 
24a70 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70  that returns a p
24a80 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74  ointer.**      t
24a90 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a  o the METHOD obj
24aa0 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ect in the previ
24ab0 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23  ous bullet..*/.#
24ac0 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53  define IOMETHODS
24ad0 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c  (FINDER, METHOD,
24ae0 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c   VERSION, CLOSE,
24af0 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
24b00 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74  KLOCK)      \.st
24b10 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
24b20 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45  e3_io_methods ME
24b30 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20  THOD = {        
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
24b60 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20  VERSION,        
24b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
24b80 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ba0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
24bb0 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
24bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
24bd0 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
24be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bf0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
24c00 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  ixRead,         
24c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
24c20 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ad */           
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
24c50 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  xWrite,         
24c60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
24c70 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c90 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
24ca0 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
24cb0 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
24cc0 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  cate */         
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
24cf0 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
24d00 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
24d10 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d30 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
24d40 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
24d50 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
24d60 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d80 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20      \.   LOCK,  
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24da0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
24db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dd0 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20     \.   UNLOCK, 
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24df0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
24e00 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20    \.   CKLOCK,  
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e40 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
24e50 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  rvedLock */     
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e70 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f   \.   unixFileCo
24e80 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
24e90 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
24ea0 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  l */            
24eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ec0 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53  \.   unixSectorS
24ed0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
24ee0 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
24ef0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
24f10 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68  .   unixDeviceCh
24f20 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
24f30 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69  /* xDeviceCapabi
24f40 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20  lities */       
24f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
24f60 20 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20     unixShmMap,  
24f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24f80 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20  * xShmMap */    
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
24fb0 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20    unixShmLock,  
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24fd0 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20   xShmLock */    
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
25000 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c   unixShmBarrier,
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25020 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20  xShmBarrier */  
25030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25040 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
25050 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 20  unixShmUnmap    
25060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
25070 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20  ShmUnmap */     
25080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25090 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20            \.};  
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250e0 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
250f0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
25100 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44  io_methods *FIND
25110 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63  ER##Impl(const c
25120 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65  har *z, unixFile
25130 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53   *p){   \.  UNUS
25140 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b  ED_PARAMETER(z);
25150 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
25160 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20  R(p);           
25170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25180 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72         \.  retur
25190 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20  n &METHOD;      
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251d0 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20        \.}       
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
25230 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
25240 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20  ethods *(*const 
25250 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68  FINDER)(const ch
25260 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29  ar*,unixFile *p)
25270 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44      \.    = FIND
25280 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a  ER##Impl;../*.**
25290 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66   Here are all of
252a0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
252b0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
252c0 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
252d0 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  ** locking strat
252e0 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e  egies.  Function
252f0 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f  s that return po
25300 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20  inters to these 
25310 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61  methods.** are a
25320 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  lso created..*/.
25330 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73  IOMETHODS(.  pos
25340 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ixIoFinder,     
25350 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
25360 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
25370 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f  /.  posixIoMetho
25380 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
25390 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
253a0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
253b0 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20  */.  2,         
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
253d0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
253e0 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
253f0 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
25400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
25410 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
25420 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
25430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
25440 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
25450 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nixUnlock,      
25460 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
25470 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
25480 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
25490 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68  dLock     /* xCh
254a0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
254b0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
254c0 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49  THODS(.  nolockI
254d0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
254e0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
254f0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
25500 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  nolockIoMethods,
25510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
25520 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
25530 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
25540 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
25550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
25560 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
25570 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c  isabled */.  nol
25580 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
25590 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
255a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
255b0 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
255c0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
255d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
255e0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
255f0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
25600 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
25610 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
25620 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b  Lock   /* xCheck
25630 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
25640 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
25650 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46  DS(.  dotlockIoF
25660 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
25670 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
25680 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74  on name */.  dot
25690 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
256a0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
256b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
256c0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
256d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256e0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
256f0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
25700 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  bled */.  dotloc
25710 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
25720 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
25730 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
25740 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
25750 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
25760 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
25770 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
25780 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
25790 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
257a0 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
257b0 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ck  /* xCheckRes
257c0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
257d0 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54   */.)..#if SQLIT
257e0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
257f0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
25800 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
25810 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  .  flockIoFinder
25820 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
25830 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
25840 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49  name */.  flockI
25850 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
25860 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
25870 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
25880 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
258b0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
258c0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73  d */.  flockClos
258d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
258e0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
258f0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b  d */.  flockLock
25900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25910 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
25920 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63   */.  flockUnloc
25930 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
25940 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
25950 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63  d */.  flockChec
25960 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
25970 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
25980 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
25990 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  .).#endif..#if O
259a0 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
259b0 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64  ODS(.  semIoFind
259c0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
259d0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
259e0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ion name */.  se
259f0 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  mIoMethods,     
25a00 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
25a10 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
25a20 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
25a30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25a40 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
25a50 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
25a60 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c  abled */.  semCl
25a70 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
25a80 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
25a90 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f  ethod */.  semLo
25aa0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
25ab0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
25ac0 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c  thod */.  semUnl
25ad0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
25ae0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
25af0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68  ethod */.  semCh
25b00 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
25b10 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
25b20 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
25b30 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
25b40 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
25b50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
25b60 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
25b70 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
25b80 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20    afpIoFinder,  
25b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
25ba0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
25bb0 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65  ame */.  afpIoMe
25bc0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
25bd0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
25be0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
25bf0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
25c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c10 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
25c20 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
25c30 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20   */.  afpClose, 
25c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c50 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
25c60 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20   */.  afpLock,  
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c80 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
25c90 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20  */.  afpUnlock, 
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25cb0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
25cc0 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65   */.  afpCheckRe
25cd0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
25ce0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
25cf0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
25d00 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
25d10 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  The proxy lockin
25d20 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73  g method is a "s
25d30 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20  uper-method" in 
25d40 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69  the sense that i
25d50 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e  t.** opens secon
25d60 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  dary file descri
25d70 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f  ptors for the co
25d80 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c  nch and lock fil
25d90 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65  es and.** it use
25da0 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c  s proxy, dot-fil
25db0 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63  e, AFP, and floc
25dc0 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  k() locking meth
25dd0 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20  ods on those.** 
25de0 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e  secondary files.
25df0 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
25e00 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
25e10 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a  that implements.
25e20 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** proxy locking
25e30 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68   is located much
25e40 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e   further down in
25e50 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20   the file.  But 
25e60 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f  we need.** to go
25e70 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e   ahead and defin
25e80 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  e the sqlite3_io
25e90 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e  _methods and fin
25ea0 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  der function.** 
25eb0 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
25ec0 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66  g here.  So we f
25ed0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74  orward declare t
25ee0 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a  he I/O methods..
25ef0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
25f00 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
25f10 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
25f20 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20  NG_STYLE.static 
25f30 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73  int proxyClose(s
25f40 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73  qlite3_file*);.s
25f50 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
25f60 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
25f70 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
25f80 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28  int proxyUnlock(
25f90 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
25fa0 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
25fb0 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
25fc0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
25fd0 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d  ile*, int*);.IOM
25fe0 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49  ETHODS(.  proxyI
25ff0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
26000 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
26010 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
26020 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c   proxyIoMethods,
26030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
26040 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
26050 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
26060 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
26070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
26080 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
26090 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72  disabled */.  pr
260a0 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  oxyClose,       
260b0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
260c0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  e method */.  pr
260d0 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  oxyLock,        
260e0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
260f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
26100 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  xyUnlock,       
26110 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
26120 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
26130 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
26140 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
26150 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
26160 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
26170 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f  ../* nfs lockd o
26180 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73  n OSX 10.3+ does
26190 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20  n't clear write 
261a0 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61  locks when a rea
261b0 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f  d lock is set */
261c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
261d0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
261e0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
261f0 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
26200 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c  (.  nfsIoFinder,
26210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26220 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
26230 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49  n name */.  nfsI
26240 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
26250 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
26260 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
26270 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26290 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
262a0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
262b0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
262c0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
262d0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
262e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
262f0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
26300 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
26310 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55  method */.  nfsU
26320 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
26330 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
26340 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
26350 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
26360 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
26370 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
26380 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
26390 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
263a0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
263b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
263c0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
263d0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
263e0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
263f0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
26400 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
26410 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
26420 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26430 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
26440 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
26450 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
26460 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
26470 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
26480 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
26490 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
264a0 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
264b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
264c0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
264d0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
264e0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
264f0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
26500 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
26510 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
26520 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
26530 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
26540 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
26550 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
26560 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
26570 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
26580 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
26590 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
265a0 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
265b0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
265c0 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
265d0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
265e0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
265f0 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
26600 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
26610 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
26620 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
26630 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
26640 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
26650 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
26660 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
26670 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
26680 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
26690 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
266a0 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
266b0 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
266c0 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
266d0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
266e0 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
266f0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
26700 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
26710 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
26720 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
26730 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
26740 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
26750 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
26760 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
26770 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
26780 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
26790 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
267a0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
267b0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
267c0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
267d0 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
267e0 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
267f0 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
26800 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
26810 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
26820 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
26830 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
26840 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
26850 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
26860 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
26870 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
26880 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
26890 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
268a0 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
268b0 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
268c0 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
268d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
268e0 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
268f0 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
26900 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
26910 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
26920 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
26930 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
26940 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
26950 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
26960 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
26970 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
26980 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
26990 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
269a0 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
269b0 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
269c0 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
269d0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
269e0 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
269f0 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
26a00 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
26a10 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
26a20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
26a30 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
26a40 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
26a50 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
26a60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
26a70 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
26a80 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
26a90 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
26aa0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
26ab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
26ac0 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
26ad0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
26ae0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
26af0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
26b00 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
26b10 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
26b20 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
26b30 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
26b40 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
26b50 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
26b60 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
26b70 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
26b80 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
26b90 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51  OS_VXWORKS && SQ
26ba0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
26bb0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
26bc0 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
26bd0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
26be0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
26bf0 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
26c00 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
26c10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26c20 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
26c30 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
26c40 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
26c50 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
26c60 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
26c70 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
26c80 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
26c90 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a   VXWorks only..*
26ca0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
26cb0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
26cc0 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
26cd0 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
26ce0 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
26cf0 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
26d00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26d10 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
26d20 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
26d30 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  * the open file 
26d40 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
26d50 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
26d60 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
26d70 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
26d80 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
26d90 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
26da0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
26db0 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
26dc0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
26dd0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
26de0 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
26df0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
26e00 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a  IoMethods;.  }..
26e10 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e    /* Test if fcn
26e20 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65  tl() is supporte
26e30 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20  d and use POSIX 
26e40 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a  style locks..  *
26e50 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
26e60 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d   back to the nam
26e70 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74  ed semaphore met
26e80 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  hod..  */.  lock
26e90 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
26ea0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
26eb0 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
26ec0 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
26ed0 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
26ee0 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
26ef0 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
26f00 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
26f10 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
26f20 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
26f30 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
26f40 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
26f50 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
26f60 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
26f70 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
26f80 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
26f90 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
26fa0 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
26fb0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
26fc0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
26fd0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
26fe0 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
26ff0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
27000 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
27010 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
27020 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
27030 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
27040 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
27050 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
27060 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
27070 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
27080 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
27090 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
270a0 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
270b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
270c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
270d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
270e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
270f0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
27100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27110 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
27120 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
27130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27140 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
27150 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
27160 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
27170 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
27180 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
27190 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
271a0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
271b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
271c0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
271d0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
271e0 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
271f0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
27200 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
27210 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
27220 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
27230 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
27240 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
27250 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
27260 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
27270 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
27280 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
27290 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20  3_file *pId,    
272a0 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
272b0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
272c0 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
272d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
272e0 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
272f0 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
27300 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
27310 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20   ctrlFlags      
27320 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
27330 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20  more UNIXFILE_* 
27340 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63  values */.){.  c
27350 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
27360 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e  methods *pLockin
27370 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
27380 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
27390 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
273a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
273b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
273c0 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20  w->pInode==NULL 
273d0 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  );..  /* Usually
273e0 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e   the path zFilen
273f0 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ame should not b
27400 65 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  e a relative pat
27410 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20  hname. The.  ** 
27420 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65  exception is whe
27430 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72  n opening the pr
27440 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65  oxy "conch" file
27450 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a   in builds that.
27460 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65    ** include the
27470 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c   special Apple l
27480 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20  ocking styles.. 
27490 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
274a0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
274b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
274c0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65  ING_STYLE.  asse
274d0 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
274e0 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
274f0 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56  =='/' .    || pV
27500 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76  fs->pAppData==(v
27510 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
27520 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a  Finder );.#else.
27530 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
27540 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
27550 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23  ame[0]=='/' );.#
27560 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c  endif..  /* No l
27570 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e  ocking occurs in
27580 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
27590 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46   */.  assert( zF
275a0 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63  ilename!=0 || (c
275b0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
275c0 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29  ILE_NOLOCK)!=0 )
275d0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  ;..  OSTRACE(("O
275e0 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e  PEN    %-3d %s\n
275f0 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ", h, zFilename)
27600 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68  );.  pNew->h = h
27610 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d  ;.  pNew->pVfs =
27620 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a   pVfs;.  pNew->z
27630 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
27640 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c  ;.  pNew->ctrlFl
27650 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c  ags = (u8)ctrlFl
27660 61 67 73 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ags;.  if( sqlit
27670 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28  e3_uri_boolean((
27680 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
27690 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69  XFILE_URI) ? zFi
276a0 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20  lename : 0),.   
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276c0 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20          "psow", 
276d0 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
276e0 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
276f0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
27700 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50  gs |= UNIXFILE_P
27710 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  SOW;.  }.  if( m
27720 65 6d 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d  emcmp(pVfs->zNam
27730 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 2c 31 30  e,"unix-excl",10
27740 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  )==0 ){.    pNew
27750 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
27760 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20  NIXFILE_EXCL;.  
27770 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
27780 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20  S.  pNew->pId = 
27790 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
277a0 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  d(zFilename);.  
277b0 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30  if( pNew->pId==0
277c0 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67   ){.    ctrlFlag
277d0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  s |= UNIXFILE_NO
277e0 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  LOCK;.    rc = S
277f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
27800 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
27810 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
27820 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20  ILE_NOLOCK ){.  
27830 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
27840 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  = &nolockIoMetho
27850 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
27860 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
27870 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65   (**(finder_type
27880 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  *)pVfs->pAppData
27890 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  )(zFilename, pNe
278a0 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  w);.#if SQLITE_E
278b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
278c0 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65  YLE.    /* Cache
278d0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68   zFilename in th
278e0 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
278f0 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f  t (AFP and dotlo
27900 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72  ck override) for
27910 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63  .    ** proxyLoc
27920 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20  k activation is 
27930 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65  possible (remote
27940 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64 20   proxy is based 
27950 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20  on db name).    
27960 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d  ** zFilename rem
27970 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
27980 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c   file is closed,
27990 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20   to support */. 
279a0 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
279b0 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a  Context = (void*
279c0 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64  )zFilename;.#end
279d0 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  if.  }..  if( pL
279e0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
279f0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23  posixIoMethods.#
27a00 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
27a10 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
27a20 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
27a30 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63  TYLE.    || pLoc
27a40 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66  kingStyle == &nf
27a50 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69  sIoMethods.#endi
27a60 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45  f.  ){.    unixE
27a70 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
27a80 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
27a90 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
27aa0 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
27ab0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27ac0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
27ad0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
27ae0 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  in findInodeInfo
27af0 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69  (), close the fi
27b00 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20  le descriptor.  
27b10 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
27b20 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61  ly, before relea
27b30 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20  sing the mutex. 
27b40 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
27b50 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a  may fail.      *
27b60 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  * in two scenari
27b70 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  os:.      **.   
27b80 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61     **   (a) A ca
27b90 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61  ll to fstat() fa
27ba0 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20  iled..      **  
27bb0 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61   (b) A malloc fa
27bc0 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  iled..      **. 
27bd0 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f       ** Scenario
27be0 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63   (b) may only oc
27bf0 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65  cur if the proce
27c00 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f  ss is holding no
27c10 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
27c20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
27c30 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
27c40 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
27c50 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65   were other file
27c60 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
27c70 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69  ptors on this fi
27c80 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c  le, then no mall
27c90 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75  oc would be requ
27ca0 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
27cb0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
27cc0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
27cd0 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69   case, it is qui
27ce0 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  te safe to close
27cf0 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  .      ** handle
27d00 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75   h - as it is gu
27d10 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f  aranteed that no
27d20 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c   posix locks wil
27d30 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20  l be released.  
27d40 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20      ** by doing 
27d50 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  so..      **.   
27d60 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69     ** If scenari
27d70 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65  o (a) caused the
27d80 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e   error then thin
27d90 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61  gs are not so sa
27da0 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  fe. The.      **
27db0 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70   implicit assump
27dc0 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61  tion here is tha
27dd0 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69  t if fstat() fai
27de0 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69  ls, things are i
27df0 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20  n.      ** such 
27e00 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64  bad shape that d
27e10 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f  ropping a lock o
27e20 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61  r two doesn't ma
27e30 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20  tter much..     
27e40 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74   */.      robust
27e50 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
27e60 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
27e70 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20   h = -1;.    }. 
27e80 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
27e90 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51  x();.  }..#if SQ
27ea0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
27eb0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
27ec0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
27ed0 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
27ee0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70  ingStyle == &afp
27ef0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
27f00 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20   /* AFP locking 
27f10 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
27f20 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
27f30 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
27f40 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c  .    ** the afpL
27f50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20  ockingContext.. 
27f60 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63     */.    afpLoc
27f70 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
27f80 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  x;.    pNew->loc
27f90 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
27fa0 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  tx = sqlite3_mal
27fb0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  loc( sizeof(*pCt
27fc0 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  x) );.    if( pC
27fd0 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  tx==0 ){.      r
27fe0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
27ff0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28000 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e     /* NB: zFilen
28010 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72  ame exists and r
28020 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
28030 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  il the file is c
28040 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  losed.      ** a
28050 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75  ccording to requ
28060 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20  irement F11141. 
28070 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65   So we do not ne
28080 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20  ed to make a.   
28090 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
280a0 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20  e filename. */. 
280b0 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74       pCtx->dbPat
280c0 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
280d0 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72       pCtx->reser
280e0 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ved = 0;.      s
280f0 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20  randomdev();.   
28100 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
28110 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x();.      rc = 
28120 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
28130 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
28140 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
28150 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28160 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
28170 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  ree(pNew->lockin
28180 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  gContext);.     
28190 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
281a0 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
281b0 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20  _);.        h = 
281c0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
281d0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
281e0 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ();        .    
281f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
28200 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
28210 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f  gStyle == &dotlo
28220 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
28230 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f     /* Dotfile lo
28240 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
28250 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
28260 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
28270 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
28280 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
28290 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a  Context .    */.
282a0 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46      char *zLockF
282b0 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  ile;.    int nFi
282c0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65  lename;.    asse
282d0 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
282e0 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d   );.    nFilenam
282f0 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
28300 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
28310 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
28320 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
28330 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65  malloc(nFilename
28340 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b  );.    if( zLock
28350 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
28360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
28370 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
28380 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
28390 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c  rintf(nFilename,
283a0 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22   zLockFile, "%s"
283b0 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c   DOTLOCK_SUFFIX,
283c0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
283d0 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63   }.    pNew->loc
283e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c  kingContext = zL
283f0 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69  ockFile;.  }..#i
28400 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65  f OS_VXWORKS.  e
28410 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
28420 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d  Style == &semIoM
28430 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
28440 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
28450 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
28460 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
28470 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
28480 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e    ** included in
28490 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43   the semLockingC
284a0 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20  ontext.    */.  
284b0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
284c0 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
284d0 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
284e0 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
284f0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
28500 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65  LITE_OK) && (pNe
28510 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d  w->pInode->pSem=
28520 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  =NULL) ){.      
28530 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d  char *zSemName =
28540 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
28550 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  SemName;.      i
28560 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt n;.      sqli
28570 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
28580 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e  _PATHNAME, zSemN
28590 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a  ame, "/%s.sem",.
285a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285b0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64         pNew->pId
285c0 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
285d0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d  );.      for( n=
285e0 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20  1; zSemName[n]; 
285f0 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66  n++ ).        if
28600 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27  ( zSemName[n]=='
28610 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  /' ) zSemName[n]
28620 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e   = '_';.      pN
28630 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
28640 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d   = sem_open(zSem
28650 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30  Name, O_CREAT, 0
28660 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  666, 1);.      i
28670 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  f( pNew->pInode-
28680 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49  >pSem == SEM_FAI
28690 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72  LED ){.        r
286a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
286b0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
286c0 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
286d0 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
286e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
286f0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
28700 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
28710 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  pNew->lastErrno 
28720 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  = 0;.#if OS_VXWO
28730 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51  RKS.  if( rc!=SQ
28740 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
28750 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
28760 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
28770 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68  __LINE__);.    h
28780 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c   = -1;.    osUnl
28790 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
287a0 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d 20 30      isDelete = 0
287b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 44 65  ;.  }.  if( isDe
287c0 6c 65 74 65 20 29 20 70 4e 65 77 2d 3e 63 74 72  lete ) pNew->ctr
287d0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
287e0 4c 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69  LE_DELETE;.#endi
287f0 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
28800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
28810 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
28820 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
28830 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65  LINE__);.  }else
28840 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74  {.    pNew->pMet
28850 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74  hod = pLockingSt
28860 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75  yle;.    OpenCou
28870 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20  nter(+1);.  }.  
28880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28890 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
288a0 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
288b0 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
288c0 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ut temporary fil
288d0 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  es..** If no sui
288e0 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  table temporary 
288f0 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63  file directory c
28900 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
28910 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
28920 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
28930 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
28940 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
28950 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
28960 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
28970 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
28980 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
28990 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
289a0 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20  "/tmp",.     0  
289b0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65        /* List te
289c0 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b  rminator */.  };
289d0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
289e0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
289f0 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
28a00 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20  ar *zDir = 0;.. 
28a10 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c   azDirs[0] = sql
28a20 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
28a30 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69  ory;.  if( !azDi
28a40 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31  rs[1] ) azDirs[1
28a50 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
28a60 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  IR");.  for(i=0;
28a70 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
28a80 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
28a90 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73  0]); zDir=azDirs
28aa0 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20  [i++]){.    if( 
28ab0 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zDir==0 ) contin
28ac0 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74  ue;.    if( osSt
28ad0 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29  at(zDir, &buf) )
28ae0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
28af0 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
28b00 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69  st_mode) ) conti
28b10 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41  nue;.    if( osA
28b20 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20  ccess(zDir, 07) 
28b30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
28b40 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
28b50 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zDir;.}../*.
28b60 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
28b70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
28b80 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
28b90 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
28ba0 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69  .** by the calli
28bb0 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d  ng process and m
28bc0 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
28bd0 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61  h to hold at lea
28be0 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61  st.** pVfs->mxPa
28bf0 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f  thname bytes..*/
28c00 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
28c10 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
28c20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
28c30 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
28c40 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
28c50 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
28c60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
28c70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
28c80 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
28c90 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
28ca0 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
28cb0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c   unsigned int i,
28cc0 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   j;.  const char
28cd0 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74   *zDir;..  /* It
28ce0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
28cf0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
28d00 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
28d10 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
28d20 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
28d30 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
28d40 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
28d50 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
28d60 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
28d70 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
28d80 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
28d90 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
28da0 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a  TE_IOERR );..  z
28db0 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69  Dir = unixTempFi
28dc0 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a  leDir();.  if( z
28dd0 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20  Dir==0 ) zDir = 
28de0 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ".";..  /* Check
28df0 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
28e00 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
28e10 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
28e20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
28e30 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
28e40 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
28e50 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
28e60 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e  */.  if( (strlen
28e70 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28  (zDir) + strlen(
28e80 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
28e90 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e  _PREFIX) + 18) >
28ea0 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  = (size_t)nBuf )
28eb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28ec0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
28ed0 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
28ee0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
28ef0 31 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  18, zBuf, "%s/"S
28f00 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
28f10 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20  PREFIX, zDir);. 
28f20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c     j = (int)strl
28f30 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
28f40 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
28f50 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
28f60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
28f70 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
28f80 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
28f90 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
28fa0 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
28fb0 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
28fc0 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
28fd0 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
28fe0 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20  ;.    zBuf[j+1] 
28ff0 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f  = 0;.  }while( o
29000 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d  sAccess(zBuf,0)=
29010 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
29020 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
29030 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29040 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
29050 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
29060 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  _)./*.** Routine
29070 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
29080 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20  unixFile into a 
29090 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e  proxy-locking un
290a0 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65  ixFile..** Imple
290b0 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65  mentation in the
290c0 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69   proxy-lock divi
290d0 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62  sion, but used b
290e0 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20  y unixOpen().** 
290f0 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
29100 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69  _PROXY_LOCKING i
29110 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  s defined..*/.st
29120 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
29130 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
29140 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74  unixFile*, const
29150 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a   char*);.#endif.
29160 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
29170 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
29180 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
29190 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74   was opened on t
291a0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
291b0 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
291c0 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f  nal or master-jo
291d0 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e  urnal file) iden
291e0 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61  tified by pathna
291f0 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68  me.** zPath with
29200 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
29210 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20   flags matching 
29220 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20  those passed as 
29230 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
29240 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
29250 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
29260 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72  uch a file descr
29270 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20  iptor may exist 
29280 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  if a database co
29290 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f  nnection was clo
292a0 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61  sed.** but the a
292b0 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64  ssociated file d
292c0 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20  escriptor could 
292d0 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65  not be closed be
292e0 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74  cause some.** ot
292f0 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
29300 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  tor open on the 
29310 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c  same file is hol
29320 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b  ding a file-lock
29330 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f  ..** Refer to co
29340 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e  mments in the un
29350 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69  ixClose() functi
29360 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  on and the lengt
29370 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65  hy comment.** de
29380 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20  scribing "Posix 
29390 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
293a0 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  " at the start o
293b0 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  f this file for 
293c0 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61  .** further deta
293d0 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65  ils. Also, ticke
293e0 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49  t #4018..**.** I
293f0 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c  f a suitable fil
29400 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
29410 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69  found, then it i
29420 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  s returned. If n
29430 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64  o.** such file d
29440 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63  escriptor is loc
29450 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ated, -1 is retu
29460 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
29470 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69  UnixUnusedFd *fi
29480 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e  ndReusableFd(con
29490 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
294a0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e  int flags){.  Un
294b0 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
294c0 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  sed = 0;..  /* D
294d0 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72  o not search for
294e0 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
294f0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78  descriptor on vx
29500 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75  works. Not becau
29510 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20  se.  ** vxworks 
29520 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69  would not benefi
29530 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67  t from the chang
29540 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27  e (it might, we'
29550 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20  re not sure),.  
29560 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e  ** but because n
29570 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74  o way to test it
29580 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76   is currently av
29590 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62  ailable. It is b
295a0 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20  etter .  ** not 
295b0 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67  to risk breaking
295c0 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74   vxworks support
295d0 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66   for the sake of
295e0 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65   such an obscure
295f0 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20   .  ** feature. 
29600 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
29610 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  RKS.  struct sta
29620 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
29630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
29640 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20  sults of stat() 
29650 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20  call */..  /* A 
29660 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  stat() call may 
29670 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73  fail for various
29680 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69   reasons. If thi
29690 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  s happens, it is
296a0 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72  .  ** almost cer
296b0 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65  tain that an ope
296c0 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20  n() call on the 
296d0 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61  same path will a
296e0 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46  lso fail..  ** F
296f0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
29700 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
29710 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29  rs in the stat()
29720 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69   call here, it i
29730 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61  s.  ** ignored a
29740 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  nd -1 is returne
29750 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
29760 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61  ll try to open a
29770 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64   new file.  ** d
29780 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
29790 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c   same path, fail
297a0 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  , and return an 
297b0 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e  error to SQLite.
297c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20  .  **.  ** Even 
297d0 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
297e0 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73  open() call does
297f0 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f   succeed, the co
29800 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20  nsequences of.  
29810 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67  ** not searching
29820 20 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65   for a resusable
29830 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
29840 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20   are not dire.  
29850 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  */.  if( 0==osSt
29860 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74  at(zPath, &sStat
29870 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f  ) ){.    unixIno
29880 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
29890 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
298a0 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64  tex();.    pInod
298b0 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  e = inodeList;. 
298c0 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65     while( pInode
298d0 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c   && (pInode->fil
298e0 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73  eId.dev!=sStat.s
298f0 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20  t_dev.          
29900 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49             || pI
29910 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
29920 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20  !=sStat.st_ino) 
29930 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ){.       pInode
29940 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
29950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29960 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  pInode ){.      
29970 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70  UnixUnusedFd **p
29980 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d  p;.      for(pp=
29990 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  &pInode->pUnused
299a0 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e  ; *pp && (*pp)->
299b0 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70  flags!=flags; pp
299c0 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  =&((*pp)->pNext)
299d0 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  );.      pUnused
299e0 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66   = *pp;.      if
299f0 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
29a00 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73       *pp = pUnus
29a10 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ed->pNext;.     
29a20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
29a30 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
29a40 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20   }.#endif    /* 
29a50 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a  if !OS_VXWORKS *
29a60 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73  /.  return pUnus
29a70 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ed;.}../*.** Thi
29a80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
29a90 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  lled by unixOpen
29aa0 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  () to determine 
29ab0 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73  the unix permiss
29ac0 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74  ions.** to creat
29ad0 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68  e new files with
29ae0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
29af0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
29b00 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
29b10 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20  .** and a value 
29b20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73  suitable for pas
29b30 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72  sing as the thir
29b40 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70  d argument to op
29b50 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74  en(2) is.** writ
29b60 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49  ten to *pMode. I
29b70 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
29b80 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
29b90 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
29ba0 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  * returned and t
29bb0 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f  he value of *pMo
29bc0 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69  de is not modifi
29bd0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73  ed..**.** In mos
29be0 74 20 63 61 73 65 73 20 63 61 73 65 73 2c 20 74  t cases cases, t
29bf0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
29c00 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68   *pMode to 0, wh
29c10 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a  ich will become.
29c20 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e  ** an indication
29c30 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28   to robust_open(
29c40 29 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  ) to create the 
29c50 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51  file using.** SQ
29c60 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
29c70 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64  E_PERMISSIONS ad
29c80 6a 75 73 74 65 64 20 62 79 20 74 68 65 20 75 6d  justed by the um
29c90 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74  ask..** But if t
29ca0 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
29cb0 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72  ened is a WAL or
29cc0 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
29cd0 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   file, then .** 
29ce0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75  this function qu
29cf0 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73  eries the file-s
29d00 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65  ystem for the pe
29d10 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
29d20 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
29d30 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
29d40 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65   and sets *pMode
29d50 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20   to this value. 
29d60 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73  Whenever .** pos
29d70 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a  sible, WAL and j
29d80 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
29d90 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
29da0 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
29db0 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61  ons .** as the a
29dc0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
29dd0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
29de0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  f the SQLITE_ENA
29df0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70  BLE_8_3_NAMES op
29e00 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
29e10 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69   then the.** ori
29e20 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
29e30 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20  s unavailable.  
29e40 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73  But 8_3_NAMES is
29e50 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a   only used for.*
29e60 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d  * FAT filesystem
29e70 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e  s and permission
29e80 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20  s do not matter 
29e90 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75  there, so just u
29ea0 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  se.** the defaul
29eb0 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a  t permissions..*
29ec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
29ed0 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
29ee0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
29ef0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
29f00 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69     /* Path of fi
29f10 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65  le (possibly) be
29f20 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20  ing created */. 
29f30 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f50 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
29f60 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74   as 4th argument
29f70 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   to xOpen() */. 
29f80 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20   mode_t *pMode, 
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fa0 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73   /* OUT: Permiss
29fb0 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c  ions to open fil
29fc0 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f  e with */.  uid_
29fd0 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20  t *pUid,        
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
29ff0 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f  UT: uid to set o
2a000 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
2a010 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20  gid_t *pGid     
2a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a030 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73  /* OUT: gid to s
2a040 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a  et on the file *
2a050 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
2a060 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2a070 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2a080 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64   Code */.  *pMod
2a090 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d  e = 0;.  *pUid =
2a0a0 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b   0;.  *pGid = 0;
2a0b0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28  .  if( flags & (
2a0c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
2a0d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2a0e0 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
2a0f0 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41   char zDb[MAX_PA
2a100 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f  THNAME+1];     /
2a110 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
2a120 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20  path */.    int 
2a130 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  nDb;            
2a140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2a150 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74  ber of valid byt
2a160 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20  es in zDb */.   
2a170 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
2a180 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  at;            /
2a190 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74  * Output of stat
2a1a0 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  () on database f
2a1b0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a  ile */..    /* z
2a1c0 50 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74  Path is a path t
2a1d0 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e  o a WAL or journ
2a1e0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c  al file. The fol
2a1f0 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72  lowing block der
2a200 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ives.    ** the 
2a210 70 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f  path to the asso
2a220 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
2a230 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e  file from zPath.
2a240 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
2a250 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  les.    ** the f
2a260 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20  ollowing naming 
2a270 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20  conventions:.   
2a280 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70   **.    **   "<p
2a290 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e  ath to db>-journ
2a2a0 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  al".    **   "<p
2a2b0 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a  ath to db>-wal".
2a2c0 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2a2d0 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e  to db>-journalNN
2a2e0 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
2a2f0 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a  h to db>-walNN".
2a300 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68      **.    ** wh
2a310 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69  ere NN is a deci
2a320 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20  mal number. The 
2a330 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65  NN naming scheme
2a340 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73  s are .    ** us
2a350 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d  ed by the test_m
2a360 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c  ultiplex.c modul
2a370 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44  e..    */.    nD
2a380 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  b = sqlite3Strle
2a390 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20  n30(zPath) - 1; 
2a3a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2a3b0 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a  NABLE_8_3_NAMES.
2a3c0 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30      while( nDb>0
2a3d0 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 6e   && sqlite3Isaln
2a3e0 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29  um(zPath[nDb]) )
2a3f0 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20   nDb--;.    if( 
2a400 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b  nDb==0 || zPath[
2a410 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72 65 74 75  nDb]!='-' ) retu
2a420 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
2a430 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 7a  lse.    while( z
2a440 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29  Path[nDb]!='-' )
2a450 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2a460 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  nDb>0 );.      a
2a470 73 73 65 72 74 28 20 7a 50 61 74 68 5b 6e 44 62  ssert( zPath[nDb
2a480 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20  ]!='\n' );.     
2a490 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65   nDb--;.    }.#e
2a4a0 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63 70 79 28  ndif.    memcpy(
2a4b0 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29  zDb, zPath, nDb)
2a4c0 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d  ;.    zDb[nDb] =
2a4d0 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20   '\0';..    if( 
2a4e0 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20 26  0==osStat(zDb, &
2a4f0 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
2a500 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73  *pMode = sStat.s
2a510 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20  t_mode & 0777;. 
2a520 20 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74       *pUid = sSt
2a530 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 20  at.st_uid;.     
2a540 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73   *pGid = sStat.s
2a550 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65  t_gid;.    }else
2a560 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2a570 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
2a580 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2a590 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
2a5a0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
2a5b0 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f  LOSE ){.    *pMo
2a5c0 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20  de = 0600;.  }. 
2a5d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a5e0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69  *.** Open the fi
2a5f0 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a  le zPath..** .**
2a600 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65   Previously, the
2a610 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72   SQLite OS layer
2a620 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63   used three func
2a630 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f  tions in place o
2a640 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a  f this.** one:.*
2a650 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
2a660 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
2a670 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
2a680 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
2a690 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
2a6a0 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
2a6b0 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ();.**.** These 
2a6c0 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64  calls correspond
2a6d0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2a6e0 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  g combinations o
2a6f0 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
2a700 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d     ReadWrite() -
2a710 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45  >     (READWRITE
2a720 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20   | CREATE).**   
2a730 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e    ReadOnly()  ->
2a740 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20       (READONLY) 
2a750 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c  .**     OpenExcl
2a760 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44  usive() -> (READ
2a770 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c  WRITE | CREATE |
2a780 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a   EXCLUSIVE).**.*
2a790 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78  * The old OpenEx
2a7a0 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74  clusive() accept
2a7b0 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67  ed a boolean arg
2a7c0 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67  ument - "delFlag
2a7d0 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74  ". If.** true, t
2a7e0 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66  he file was conf
2a7f0 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74  igured to be aut
2a800 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
2a810 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66  ed when the.** f
2a820 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65  ile handle close
2a830 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68  d. To achieve th
2a840 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73  e same effect us
2a850 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a  ing this new .**
2a860 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20   interface, add 
2a870 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  the DELETEONCLOS
2a880 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20  E flag to those 
2a890 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20  specified above 
2a8a0 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c  for .** OpenExcl
2a8b0 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  usive()..*/.stat
2a8c0 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28  ic int unixOpen(
2a8d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2a8e0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
2a8f0 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77  /* The VFS for w
2a900 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65  hich this is the
2a910 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f   xOpen method */
2a920 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a930 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
2a940 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66  /* Pathname of f
2a950 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ile to be opened
2a960 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
2a970 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
2a980 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
2a990 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20  escriptor to be 
2a9a0 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69  filled in */.  i
2a9b0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2a9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a9d0 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f  nput flags to co
2a9e0 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e  ntrol the openin
2a9f0 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  g */.  int *pOut
2aa00 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
2aa10 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c      /* Output fl
2aa20 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ags returned to 
2aa30 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29  SQLite core */.)
2aa40 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20  {.  unixFile *p 
2aa50 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46  = (unixFile *)pF
2aa60 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20  ile;.  int fd = 
2aa70 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
2aa80 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
2aa90 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65  scriptor returne
2aaa0 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  d by open() */. 
2aab0 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
2aac0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2aad0 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
2aae0 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   to open() */.  
2aaf0 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
2ab00 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
2ab10 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
2ab20 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
2ab30 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  noLock;         
2ab40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ab50 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69  ue to omit locki
2ab60 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f  ng primitives */
2ab70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ab80 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2ab90 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
2aba0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
2abb0 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30  nt ctrlFlags = 0
2abc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2abd0 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67   UNIXFILE_* flag
2abe0 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78  s */..  int isEx
2abf0 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
2ac00 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2ac10 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
2ac20 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
2ac30 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2ac40 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
2ac50 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
2ac60 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
2ac70 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2ac80 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69  CREATE);.  int i
2ac90 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66  sReadonly   = (f
2aca0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2acb0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2acc0 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20  int isReadWrite 
2acd0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2ace0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2acf0 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  E);.#if SQLITE_E
2ad00 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2ad10 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f  YLE.  int isAuto
2ad20 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20  Proxy  = (flags 
2ad30 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55  & SQLITE_OPEN_AU
2ad40 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66  TOPROXY);.#endif
2ad50 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2ad60 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
2ad70 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2ad80 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20  _STYLE.  struct 
2ad90 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23  statfs fsInfo;.#
2ada0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63  endif..  /* If c
2adb0 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72  reating a master
2adc0 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f   or main-file jo
2add0 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63  urnal, this func
2ade0 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20  tion will open. 
2adf0 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72   ** a file-descr
2ae00 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72  iptor on the dir
2ae10 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20  ectory too. The 
2ae20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53  first time unixS
2ae30 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61  ync().  ** is ca
2ae40 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f  lled the directo
2ae50 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
2ae60 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63  or will be fsync
2ae70 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29  ()ed and close()
2ae80 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79  d..  */.  int sy
2ae90 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65 61 74  ncDir = (isCreat
2aea0 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
2aeb0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2aec0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
2aed0 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
2aee0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2aef0 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  N_JOURNAL .     
2af00 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2af10 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a  _OPEN_WAL.  ));.
2af20 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
2af30 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
2af40 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
2af50 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
2af60 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
2af70 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
2af80 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
2af90 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
2afa0 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
2afb0 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e   */.  char zTmpn
2afc0 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
2afd0 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  +2];.  const cha
2afe0 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68  r *zName = zPath
2aff0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
2b000 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
2b010 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a  ements are true:
2b020 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61   .  **.  **   (a
2b030 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  ) Exactly one of
2b040 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61   the READWRITE a
2b050 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  nd READONLY flag
2b060 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61  s must be set, a
2b070 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69  nd .  **   (b) i
2b080 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c  f CREATE is set,
2b090 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20   then READWRITE 
2b0a0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
2b0b0 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29  , and.  **   (c)
2b0c0 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73   if EXCLUSIVE is
2b0d0 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
2b0e0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
2b0f0 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69  et..  **   (d) i
2b100 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  f DELETEONCLOSE 
2b110 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
2b120 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
2b130 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
2b140 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d  ert((isReadonly=
2b150 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
2b160 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64  e==0) && (isRead
2b170 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f  Write || isReado
2b180 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28  nly));.  assert(
2b190 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69  isCreate==0 || i
2b1a0 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61  sReadWrite);.  a
2b1b0 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76  ssert(isExclusiv
2b1c0 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
2b1d0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65  );.  assert(isDe
2b1e0 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  lete==0 || isCre
2b1f0 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ate);..  /* The 
2b200 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f  main DB, main jo
2b210 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20  urnal, WAL file 
2b220 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
2b230 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20  al are never .  
2b240 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
2b250 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72   deleted. Nor ar
2b260 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70  e they ever temp
2b270 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f  orary files.  */
2b280 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
2b290 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
2b2a0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
2b2b0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
2b2c0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
2b2d0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
2b2e0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
2b2f0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2b300 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
2b310 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
2b320 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
2b330 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
2b340 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  R_JOURNAL );.  a
2b350 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2b360 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2b370 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2b380 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41  N_WAL );..  /* A
2b390 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
2b3a0 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
2b3b0 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
2b3c0 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
2b3d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
2b3e0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2b3f0 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
2b400 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2b410 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
2b420 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2b430 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2b440 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
2b450 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
2b460 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
2b470 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2b480 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
2b490 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
2b4a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
2b4b0 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
2b4c0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2b4d0 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
2b4e0 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53  T_DB || eType==S
2b4f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
2b500 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c   );..  memset(p,
2b510 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
2b520 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54  ile));..  if( eT
2b530 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2b540 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
2b550 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
2b560 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73  nused;.    pUnus
2b570 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c  ed = findReusabl
2b580 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  eFd(zName, flags
2b590 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73  );.    if( pUnus
2b5a0 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d  ed ){.      fd =
2b5b0 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
2b5c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2b5d0 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33  Unused = sqlite3
2b5e0 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
2b5f0 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20  pUnused));.     
2b600 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
2b610 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b620 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2b630 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2b640 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e  p->pUnused = pUn
2b650 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61  used;..    /* Da
2b660 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73  tabase filenames
2b670 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f   are double-zero
2b680 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74   terminated if t
2b690 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20  hey are not.    
2b6a0 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72  ** URIs with par
2b6b0 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c  ameters.  Hence,
2b6c0 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73   they can always
2b6d0 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a   be passed into.
2b6e0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75      ** sqlite3_u
2b6f0 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20  ri_parameter(). 
2b700 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
2b710 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2b720 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d  PEN_URI) || zNam
2b730 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  e[strlen(zName)+
2b740 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73  1]==0 );..  }els
2b750 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a  e if( !zName ){.
2b760 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
2b770 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70  is NULL, the upp
2b780 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75  er layer is requ
2b790 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69  esting a temp fi
2b7a0 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
2b7b0 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 73  t(isDelete && !s
2b7c0 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20  yncDir);.    rc 
2b7d0 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  = unixGetTempnam
2b7e0 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e(MAX_PATHNAME+2
2b7f0 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
2b800 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b810 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2b820 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2b830 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d   zName = zTmpnam
2b840 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  e;..    /* Gener
2b850 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  ated temporary f
2b860 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77  ilenames are alw
2b870 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20  ays double-zero 
2b880 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a  terminated.    *
2b890 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c  * for use by sql
2b8a0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
2b8b0 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73  er(). */.    ass
2b8c0 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65  ert( zName[strle
2b8d0 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29  n(zName)+1]==0 )
2b8e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
2b8f0 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20  rmine the value 
2b900 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  of the flags par
2b910 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
2b920 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a   POSIX function.
2b930 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65    ** open(). The
2b940 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75  se must be calcu
2b950 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70  lated even if op
2b960 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  en() is not call
2b970 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79  ed, as.  ** they
2b980 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
2b990 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  s part of the fi
2b9a0 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73  le handle and us
2b9b0 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20  ed by the .  ** 
2b9c0 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63  'conch file' loc
2b9d0 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c  king functions l
2b9e0 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69  ater on.  */.  i
2b9f0 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
2ba00 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2ba10 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73  RDONLY;.  if( is
2ba20 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e  ReadWrite ) open
2ba30 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b  Flags |= O_RDWR;
2ba40 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20  .  if( isCreate 
2ba50 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  )    openFlags |
2ba60 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28  = O_CREAT;.  if(
2ba70 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f   isExclusive ) o
2ba80 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45  penFlags |= (O_E
2ba90 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b  XCL|O_NOFOLLOW);
2baa0 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  .  openFlags |= 
2bab0 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42  (O_LARGEFILE|O_B
2bac0 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66  INARY);..  if( f
2bad0 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f  d<0 ){.    mode_
2bae0 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20  t openMode;     
2baf0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d           /* Perm
2bb00 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74  issions to creat
2bb10 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20  e file with */. 
2bb20 20 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20     uid_t uid;   
2bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb40 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74   /* Userid for t
2bb50 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67  he file */.    g
2bb60 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20  id_t gid;       
2bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bb80 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20  Groupid for the 
2bb90 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  file */.    rc =
2bba0 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d   findCreateFileM
2bbb0 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  ode(zName, flags
2bbc0 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69  , &openMode, &ui
2bbd0 64 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66  d, &gid);.    if
2bbe0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2bbf0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2bc00 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a   !p->pUnused );.
2bc10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
2bc20 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2bc30 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  _WAL || eType==S
2bc40 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2bc50 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20  JOURNAL );.     
2bc60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2bc70 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  }.    fd = robus
2bc80 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  t_open(zName, op
2bc90 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
2bca0 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
2bcb0 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25  ("OPENX   %-3d %
2bcc0 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e  s 0%o\n", fd, zN
2bcd0 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29  ame, openFlags))
2bce0 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26  ;.    if( fd<0 &
2bcf0 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20  & errno!=EISDIR 
2bd00 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20 26  && isReadWrite &
2bd10 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
2bd20 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65  {.      /* Faile
2bd30 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  d to open the fi
2bd40 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  le for read/writ
2bd50 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65  e access. Try re
2bd60 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  ad-only. */.    
2bd70 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c    flags &= ~(SQL
2bd80 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2bd90 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
2bda0 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70  REATE);.      op
2bdb0 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52  enFlags &= ~(O_R
2bdc0 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20  DWR|O_CREAT);.  
2bdd0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
2bde0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2bdf0 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  Y;.      openFla
2be00 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
2be10 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79        isReadonly
2be20 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d   = 1;.      fd =
2be30 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61   robust_open(zNa
2be40 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f  me, openFlags, o
2be50 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  penMode);.    }.
2be60 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
2be70 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
2be80 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
2be90 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
2bea0 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  pen", zName);.  
2beb0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
2bec0 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  nished;.    }.. 
2bed0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72     /* If this pr
2bee0 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67  ocess is running
2bef0 20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20   as root and if 
2bf00 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72  creating a new r
2bf10 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a  ollback.    ** j
2bf20 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69  ournal or WAL fi
2bf30 6c 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65  le, set the owne
2bf40 72 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75  rship of the jou
2bf50 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62  rnal or WAL to b
2bf60 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  e.    ** the sam
2bf70 65 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61  e as the origina
2bf80 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  l database..    
2bf90 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  */.    if( flags
2bfa0 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
2bfb0 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  WAL|SQLITE_OPEN_
2bfc0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b  MAIN_JOURNAL) ){
2bfd0 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28  .      osFchown(
2bfe0 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20  fd, uid, gid);. 
2bff0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
2c000 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66  t( fd>=0 );.  if
2c010 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
2c020 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
2c030 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
2c040 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a  ( p->pUnused ){.
2c050 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e      p->pUnused->
2c060 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e  fd = fd;.    p->
2c070 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
2c080 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
2c090 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
2c0a0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2c0b0 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b    zPath = zName;
2c0c0 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c  .#else.    osUnl
2c0d0 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64  ink(zName);.#end
2c0e0 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  if.  }.#if SQLIT
2c0f0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2c100 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20  _STYLE.  else{. 
2c110 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20     p->openFlags 
2c120 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d  = openFlags;.  }
2c130 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63  .#endif..  noLoc
2c140 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54  k = eType!=SQLIT
2c150 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a  E_OPEN_MAIN_DB;.
2c160 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .  .#if defined(
2c170 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51  __APPLE__) || SQ
2c180 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2c190 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20  ING_STYLE.  if( 
2c1a0 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49  fstatfs(fd, &fsI
2c1b0 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
2c1c0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
2c1d0 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  ile)->lastErrno 
2c1e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 6f 62  = errno;.    rob
2c1f0 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
2c200 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2c210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2c220 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a  ERR_ACCESS;.  }.
2c230 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63    if (0 == strnc
2c240 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e  mp("msdos", fsIn
2c250 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
2c260 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69   5)) {.    ((uni
2c270 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66  xFile*)pFile)->f
2c280 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
2c290 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
2c2a0 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  S;.  }.#endif.. 
2c2b0 20 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f   /* Set up appro
2c2c0 70 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73  priate ctrlFlags
2c2d0 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65   */.  if( isDele
2c2e0 74 65 20 29 20 20 20 20 20 20 20 20 20 20 20 20  te )            
2c2f0 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
2c300 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
2c310 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  ;.  if( isReadon
2c320 6c 79 20 29 20 20 20 20 20 20 20 20 20 20 20 20  ly )            
2c330 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
2c340 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a  NIXFILE_RDONLY;.
2c350 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20    if( noLock )  
2c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c370 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2c380 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20  XFILE_NOLOCK;.  
2c390 69 66 28 20 73 79 6e 63 44 69 72 20 29 20 20 20  if( syncDir )   
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
2c3b0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2c3c0 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69  ILE_DIRSYNC;.  i
2c3d0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
2c3e0 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72  E_OPEN_URI ) ctr
2c3f0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2c400 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c  LE_URI;..#if SQL
2c410 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2c420 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c  NG_STYLE.#if SQL
2c430 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
2c440 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74  _LOCKING.  isAut
2c450 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64  oProxy = 1;.#end
2c460 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50  if.  if( isAutoP
2c470 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d  roxy && (zPath!=
2c480 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63  NULL) && (!noLoc
2c490 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65  k) && pVfs->xOpe
2c4a0 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65  n ){.    char *e
2c4b0 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76  nvforce = getenv
2c4c0 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  ("SQLITE_FORCE_P
2c4d0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a  ROXY_LOCKING");.
2c4e0 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79      int useProxy
2c4f0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51   = 0;..    /* SQ
2c500 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
2c510 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e  _LOCKING==1 mean
2c520 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75  s force always u
2c530 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e  se proxy, 0 mean
2c540 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20  s .    ** never 
2c550 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20  use proxy, NULL 
2c560 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20  means use proxy 
2c570 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69  for non-local fi
2c580 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20  les only.  */.  
2c590 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d    if( envforce!=
2c5a0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73  NULL ){.      us
2c5b0 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e  eProxy = atoi(en
2c5c0 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d  vforce)>0;.    }
2c5d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
2c5e0 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66  statfs(zPath, &f
2c5f0 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a  sInfo) == -1 ){.
2c600 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
2c610 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28  eory, the close(
2c620 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d  fd) call is sub-
2c630 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20  optimal. If the 
2c640 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20  file opened.    
2c650 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69      ** with fd i
2c660 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
2c670 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
2c680 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2c690 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  ns open.        
2c6a0 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ** on that file 
2c6b0 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
2c6c0 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73  ly holding advis
2c6d0 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c  ory locks on it,
2c6e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
2c6f0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f   the call to clo
2c700 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c  se() will cancel
2c710 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e   those locks. In
2c720 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20   practice,.     
2c730 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75     ** we're assu
2c740 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73  ming that statfs
2c750 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20  () doesn't fail 
2c760 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c  very often. At l
2c770 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  east.        ** 
2c780 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20  not while other 
2c790 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2c7a0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73   opened by the s
2c7b0 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20  ame process on. 
2c7c0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61         ** the sa
2c7d0 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b  me file are work
2c7e0 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ing.  */.       
2c7f0 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20   p->lastErrno = 
2c800 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
2c810 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66  obust_close(p, f
2c820 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
2c830 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c840 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
2c850 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65          goto ope
2c860 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
2c870 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f    }.      usePro
2c880 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f  xy = !(fsInfo.f_
2c890 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29  flags&MNT_LOCAL)
2c8a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c8b0 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  useProxy ){.    
2c8c0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
2c8d0 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
2c8e0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74  pFile, zPath, ct
2c8f0 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  rlFlags);.      
2c900 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c910 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2c920 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  = proxyTransform
2c930 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69  UnixFile((unixFi
2c940 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74  le*)pFile, ":aut
2c950 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  o:");.        if
2c960 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2c980 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f  Use unixClose to
2c990 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65   clean up the re
2c9a0 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69 6e  sources added in
2c9b0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20   fillInUnixFile 
2c9c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
2c9d0 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20  d clear all the 
2c9e0 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66 65  structure's refe
2c9f0 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69  rences.  Specifi
2ca00 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20  cally, .        
2ca10 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74    ** pFile->pMet
2ca20 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c  hods will be NUL
2ca30 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c  L so sqlite3OsCl
2ca40 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f  ose will be a no
2ca50 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a  -op .          *
2ca60 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78  /.          unix
2ca70 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20  Close(pFile);.  
2ca80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2ca90 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2caa0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
2cab0 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
2cac0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2cad0 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e    .  rc = fillIn
2cae0 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
2caf0 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c  d, pFile, zPath,
2cb00 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70   ctrlFlags);..op
2cb10 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69  en_finished:.  i
2cb20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cb30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2cb40 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29  free(p->pUnused)
2cb50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2cb60 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  c;.}.../*.** Del
2cb70 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20  ete the file at 
2cb80 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
2cb90 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
2cba0 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a  s true, fsync().
2cbb0 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
2cbc0 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
2cbd0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
2cbe0 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
2cbf0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
2cc00 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  s *NotUsed,     
2cc10 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  /* VFS containin
2cc20 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44  g this as the xD
2cc30 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  elete method */.
2cc40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2cc50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ath,        /* N
2cc60 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
2cc70 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69  e deleted */.  i
2cc80 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20  nt dirSync      
2cc90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
2cca0 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72  rue, fsync() dir
2ccb0 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
2ccc0 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b  eting file */.){
2ccd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2cce0 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
2ccf0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2cd00 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
2cd10 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
2cd20 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
2cd30 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e  );.  if( osUnlin
2cd40 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 29  k(zPath)==(-1) )
2cd50 7b 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d  {.    if( errno=
2cd60 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
2cd70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2cd80 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
2cd90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2cda0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
2cdb0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
2cdc0 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b  _DELETE, "unlink
2cdd0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
2cde0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2cdf0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
2ce00 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
2ce10 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e  NC.  if( (dirSyn
2ce20 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20  c & 1)!=0 ){.   
2ce30 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
2ce40 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
2ce50 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
2ce60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ce70 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56  E_OK ){.#if OS_V
2ce80 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28  XWORKS.      if(
2ce90 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29   fsync(fd)==-1 )
2cea0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28  .#else.      if(
2ceb0 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e   fsync(fd) ).#en
2cec0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
2ced0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
2cee0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
2cef0 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66  RR_DIR_FSYNC, "f
2cf00 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20  sync", zPath);. 
2cf10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62       }.      rob
2cf20 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
2cf30 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2cf40 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2cf50 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
2cf60 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2cf70 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2cf80 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
2cf90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
2cfa0 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  st the existance
2cfb0 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
2cfc0 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
2cfd0 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
2cfe0 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
2cff0 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
2d000 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
2d010 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
2d020 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
2d030 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
2d040 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
2d050 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
2d060 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
2d070 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
2d080 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
2d090 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
2d0a0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
2d0b0 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
2d0c0 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
2d0d0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
2d0e0 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
2d0f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2d100 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
2d110 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2d120 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63  ,   /* The VFS c
2d130 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78  ontaining this x
2d140 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f  Access method */
2d150 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2d160 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61  Path,      /* Pa
2d170 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  th of the file t
2d180 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69  o examine */.  i
2d190 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2d1a0 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64         /* What d
2d1b0 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61  o we want to lea
2d1c0 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61  rn about the zPa
2d1d0 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e  th file? */.  in
2d1e0 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
2d1f0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
2d200 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65  esult boolean he
2d210 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
2d220 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53  mode = 0;.  UNUS
2d230 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2d240 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
2d250 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
2d260 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
2d270 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
2d280 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
2d290 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
2d2a0 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
2d2b0 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
2d2c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2d2d0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
2d2e0 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
2d2f0 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
2d300 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
2d310 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2d320 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
2d330 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
2d340 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
2d350 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
2d360 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
2d370 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
2d380 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
2d390 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63  pResOut = (osAcc
2d3a0 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65  ess(zPath, amode
2d3b0 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61  )==0);.  if( fla
2d3c0 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
2d3d0 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65  S_EXISTS && *pRe
2d3e0 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75  sOut ){.    stru
2d3f0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
2d400 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a   if( 0==osStat(z
2d410 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62  Path, &buf) && b
2d420 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b  uf.st_size==0 ){
2d430 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20  .      *pResOut 
2d440 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
2d450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d460 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  K;.}.../*.** Tur
2d470 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
2d480 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
2d490 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20  l pathname. The 
2d4a0 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a  relative path.**
2d4b0 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20   is stored as a 
2d4c0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
2d4d0 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66  tring in the buf
2d4e0 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
2d4f0 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a  y.** zPath. .**.
2d500 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74  ** zOut points t
2d510 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
2d520 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76   least sqlite3_v
2d530 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  fs.mxPathname by
2d540 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73  tes .** (in this
2d550 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e   case, MAX_PATHN
2d560 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20  AME bytes). The 
2d570 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69  full-path is wri
2d580 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20  tten to.** this 
2d590 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65  buffer before re
2d5a0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
2d5b0 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50  ic int unixFullP
2d5c0 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
2d5d0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2d5e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2d5f0 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
2d600 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
2d610 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
2d620 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
2d630 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
2d640 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  path */.  int nO
2d650 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
2d660 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2d670 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
2d680 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
2d690 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20  har *zOut       
2d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d6b0 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
2d6c0 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  .){..  /* It's o
2d6d0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
2d6e0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
2d6f0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
2d700 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
2d710 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
2d720 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
2d730 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
2d740 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
2d750 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
2d760 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
2d770 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
2d780 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
2d790 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
2d7a0 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
2d7b0 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
2d7c0 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
2d7d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
2d7e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2d7f0 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
2d800 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
2d810 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
2d820 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
2d830 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
2d840 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20   zOut[nOut-1] = 
2d850 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74  '\0';.  if( zPat
2d860 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[0]=='/' ){.   
2d870 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2d880 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25  f(nOut, zOut, "%
2d890 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65  s", zPath);.  }e
2d8a0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77  lse{.    int nCw
2d8b0 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  d;.    if( osGet
2d8c0 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31  cwd(zOut, nOut-1
2d8d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
2d8e0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
2d8f0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
2d900 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22  N_BKPT, "getcwd"
2d910 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
2d920 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29      nCwd = (int)
2d930 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20  strlen(zOut);.  
2d940 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2d950 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a  tf(nOut-nCwd, &z
2d960 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22  Out[nCwd], "/%s"
2d970 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  , zPath);.  }.  
2d980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d990 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
2d9a0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
2d9b0 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
2d9c0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
2d9d0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
2d9e0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
2d9f0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
2da00 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
2da10 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
2da20 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
2da30 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
2da40 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
2da50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
2da60 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
2da70 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
2da80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2da90 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
2daa0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2dab0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
2dac0 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
2dad0 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
2dae0 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
2daf0 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
2db00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
2db10 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
2db20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
2db30 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
2db40 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
2db50 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
2db60 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
2db70 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
2db80 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
2db90 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
2dba0 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
2dbb0 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
2dbc0 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
2dbd0 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
2dbe0 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
2dbf0 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
2dc00 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
2dc10 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
2dc20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
2dc30 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
2dc40 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2dc50 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
2dc60 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  zBufOut){.  cons
2dc70 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
2dc80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2dc90 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
2dca0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2dcb0 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
2dcc0 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
2dcd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2dce0 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
2dcf0 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
2dd00 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
2dd10 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
2dd20 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c  ic void (*unixDl
2dd30 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
2dd40 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
2dd50 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
2dd60 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ym))(void){.  /*
2dd70 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20   .  ** GCC with 
2dd80 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
2dd90 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64   says that C90 d
2dda0 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
2ddb0 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a  void* to be.  **
2ddc0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69   cast into a poi
2ddd0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
2dde0 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65  on.  And yet the
2ddf0 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29   library dlsym()
2de00 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65   routine.  ** re
2de10 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68  turns a void* wh
2de20 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
2de30 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
2de40 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64  ction.  So how d
2de50 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c  o we.  ** use dl
2de60 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61  sym() with -peda
2de70 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a  ntic-errors?.  *
2de80 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20  *.  ** Variable 
2de90 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e  x below is defin
2dea0 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74  ed to be a point
2deb0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
2dec0 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72   taking.  ** par
2ded0 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e  ameters void* an
2dee0 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e  d const char* an
2def0 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f  d returning a po
2df00 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
2df10 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69  ion..  ** We ini
2df20 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73  tialize x by ass
2df30 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e  igning it a poin
2df40 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d  ter to the dlsym
2df50 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  () function..  *
2df60 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65  * (That assignme
2df70 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61  nt requires a ca
2df80 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61  st.)  Then we ca
2df90 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
2dfa0 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e  that.  ** x poin
2dfb0 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  ts to.  .  **.  
2dfc0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ** This work-aro
2dfd0 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20  und is unlikely 
2dfe0 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  to work correctl
2dff0 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20  y on any system 
2e000 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72  where.  ** you r
2e010 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73  eally cannot cas
2e020 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  t a function poi
2e030 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e  nter into void*.
2e040 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74    But then, on t
2e050 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61  he.  ** other ha
2e060 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c  nd, dlsym() will
2e070 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63   not work on suc
2e080 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65  h a system eithe
2e090 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20  r, so we have.  
2e0a0 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f  ** not really lo
2e0b0 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a  st anything..  *
2e0c0 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28  /.  void (*(*x)(
2e0d0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
2e0e0 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55  *))(void);.  UNU
2e0f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2e100 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76  tUsed);.  x = (v
2e110 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63  oid(*(*)(void*,c
2e120 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
2e130 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75  d))dlsym;.  retu
2e140 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29  rn (*x)(p, zSym)
2e150 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2e160 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69  unixDlClose(sqli
2e170 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2e180 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
2e190 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2e1a0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2e1b0 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65   dlclose(pHandle
2e1c0 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
2e1d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
2e1e0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
2e1f0 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
2e200 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20  fine unixDlOpen 
2e210 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
2e220 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  xDlError 0.  #de
2e230 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20  fine unixDlSym  
2e240 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
2e250 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  xDlClose 0.#endi
2e260 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e  f../*.** Write n
2e270 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
2e280 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20  dom data to the 
2e290 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20  supplied buffer 
2e2a0 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
2e2b0 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65  int unixRandomne
2e2c0 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
2e2d0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
2e2e0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2e2f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2e300 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61  ER(NotUsed);.  a
2e310 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42  ssert((size_t)nB
2e320 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
2e330 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
2e340 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
2e350 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
2e360 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
2e370 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
2e380 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
2e390 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
2e3a0 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
2e3b0 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
2e3c0 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
2e3d0 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
2e3e0 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
2e3f0 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
2e400 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
2e410 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
2e420 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
2e430 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
2e440 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
2e450 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
2e460 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
2e470 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
2e480 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
2e490 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
2e4a0 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
2e4b0 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
2e4c0 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
2e4d0 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
2e4e0 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
2e4f0 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
2e500 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
2e510 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
2e520 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
2e530 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
2e540 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
2e550 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
2e560 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
2e570 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
2e580 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
2e590 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
2e5a0 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
2e5b0 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
2e5c0 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
2e5d0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2e5e0 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20  TE_TEST).  {.   
2e5f0 20 69 6e 74 20 70 69 64 2c 20 66 64 2c 20 67 6f   int pid, fd, go
2e600 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  t;.    fd = robu
2e610 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72  st_open("/dev/ur
2e620 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
2e630 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
2e640 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
2e650 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
2e660 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
2e670 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
2e680 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70  eof(t));.      p
2e690 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
2e6a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
2e6b0 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70  f[sizeof(t)], &p
2e6c0 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
2e6d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2e6e0 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66  sizeof(t)+sizeof
2e6f0 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e  (pid)<=(size_t)n
2e700 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75  Buf );.      nBu
2e710 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20  f = sizeof(t) + 
2e720 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20  sizeof(pid);.   
2e730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f   }else{.      do
2e740 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66  { got = osRead(f
2e750 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20  d, zBuf, nBuf); 
2e760 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
2e770 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
2e780 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
2e790 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
2e7a0 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E__);.    }.  }.
2e7b0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2e7c0 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
2e7d0 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
2e7e0 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
2e7f0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
2e800 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
2e810 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
2e820 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
2e830 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
2e840 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
2e850 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2e860 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2e870 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
2e880 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
2e890 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
2e8a0 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
2e8b0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
2e8c0 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
2e8d0 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
2e8e0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
2e8f0 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
2e900 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
2e910 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
2e920 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
2e930 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
2e940 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2e950 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
2e960 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
2e970 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
2e980 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
2e990 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
2e9a0 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
2e9b0 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
2e9c0 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
2e9d0 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
2e9e0 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
2e9f0 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
2ea00 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2ea10 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
2ea20 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
2ea30 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
2ea40 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
2ea50 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
2ea60 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
2ea70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2ea80 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2ea90 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
2eaa0 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
2eab0 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
2eac0 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
2ead0 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
2eae0 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
2eaf0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2eb00 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
2eb10 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
2eb20 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
2eb30 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2eb40 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
2eb50 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
2eb60 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
2eb70 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
2eb80 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
2eb90 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
2eba0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
2ebb0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
2ebc0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
2ebd0 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
2ebe0 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
2ebf0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2ec00 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
2ec10 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
2ec20 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
2ec30 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
2ec40 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
2ec50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
2ec60 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
2ec70 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
2ec80 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
2ec90 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
2eca0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
2ecb0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
2ecc0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
2ecd0 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
2ece0 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
2ecf0 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
2ed00 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2ed10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
2ed20 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
2ed30 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
2ed40 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
2ed50 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
2ed60 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
2ed70 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
2ed80 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
2ed90 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
2eda0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
2edb0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
2edc0 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
2edd0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
2ede0 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
2edf0 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
2ee00 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
2ee10 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
2ee20 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
2ee30 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2ee40 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
2ee50 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69  *piNow){.  stati
2ee60 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2ee70 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
2ee80 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
2ee90 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
2eea0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
2eeb0 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66  LITE_OK;.#if def
2eec0 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
2eed0 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
2eee0 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
2eef0 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
2ef00 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)t)*1000 + uni
2ef10 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
2ef20 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
2ef30 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
2ef40 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
2ef50 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
2ef60 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
2ef70 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
2ef80 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2ef90 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
2efa0 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
2efb0 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
2efc0 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
2efd0 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69  Now;.  if( getti
2efe0 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
2eff0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e  )==0 ){.    *piN
2f000 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
2f010 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
2f020 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
2f030 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
2f040 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  1000;.  }else{. 
2f050 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2f060 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RROR;.  }.#endif
2f070 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2f080 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
2f090 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2f0a0 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
2f0b0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2f0c0 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
2f0d0 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
2f0e0 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
2f0f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2f100 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2f110 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2f120 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
2f130 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
2f140 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
2f150 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
2f160 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
2f170 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
2f180 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
2f190 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
2f1a0 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
2f1b0 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
2f1c0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
2f1d0 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
2f1e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2f1f0 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
2f200 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2f210 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70  tUsed, double *p
2f220 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33  rNow){.  sqlite3
2f230 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20  _int64 i = 0;.  
2f240 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44  int rc;.  UNUSED
2f250 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2f260 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78  ed);.  rc = unix
2f270 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2f280 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f  (0, &i);.  *prNo
2f290 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
2f2a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2f2b0 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64  ../*.** We added
2f2c0 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   the xGetLastErr
2f2d0 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68  or() method with
2f2e0 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f   the intention o
2f2f0 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62  f providing.** b
2f300 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20  etter low-level 
2f310 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77  error messages w
2f320 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79  hen operating-sy
2f330 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f  stem problems co
2f340 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20  me up.** during 
2f350 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e  SQLite operation
2f360 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e  .  But so far, n
2f370 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20  one of that has 
2f380 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  been implemented
2f390 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  .** in the core.
2f3a0 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e    So this routin
2f3b0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
2f3c0 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20  d.  For now, it 
2f3d0 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70  is merely.** a p
2f3e0 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a  lace-holder..*/.
2f3f0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
2f400 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
2f410 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2f420 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
2f430 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
2f440 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2f450 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2f460 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2f470 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
2f480 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2f490 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
2f4a0 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a  rn 0;.}.../*.***
2f4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f4c0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c  ***** End of sql
2f4d0 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
2f4e0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2f4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
2f500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
2f550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2f5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f5b0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50  ******** Begin P
2f5c0 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  roxy Locking ***
2f5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2f5f0 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
2f600 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63  g is a "uber-loc
2f610 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20  king-method" in 
2f620 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20  this sense:  It 
2f630 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65  uses the.** othe
2f640 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  r locking method
2f650 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c  s on secondary l
2f660 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78  ock files.  Prox
2f670 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a  y locking is a.*
2f680 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65  * meta-layer ove
2f690 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69  r top of the pri
2f6a0 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69  mitive locking i
2f6b0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65  mplemented above
2f6c0 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72  .  For.** this r
2f6d0 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
2f6e0 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
2f6f0 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  nts of proxy loc
2f700 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64  king is deferred
2f710 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69  .** until late i
2f720 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65  n the file (here
2f730 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74  ) after all of t
2f740 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74  he other I/O met
2f750 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  hods have.** bee
2f760 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74  n defined - so t
2f770 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76  hat the primitiv
2f780 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
2f790 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a  s are available.
2f7a0 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74  ** as services t
2f7b0 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20  o help with the 
2f7c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2f7d0 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e  f proxy locking.
2f7e0 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  .**.****.**.** T
2f7f0 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
2f800 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51  ng schemes in SQ
2f810 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61  Lite use byte-ra
2f820 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  nge locks on the
2f830 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
2f840 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  e to coordinate 
2f850 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  safe, concurrent
2f860 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
2f870 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61  ple readers.** a
2f880 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70  nd writers [http
2f890 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f  ://sqlite.org/lo
2f8a0 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20  ckingv3.html].  
2f8b0 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f  The five file lo
2f8c0 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20  cking.** states 
2f8d0 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49  (UNLOCKED, PENDI
2f8e0 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  NG, SHARED, RESE
2f8f0 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29  RVED, EXCLUSIVE)
2f900 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
2f910 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61  .** as POSIX rea
2f920 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  d & write locks 
2f930 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f  over fixed set o
2f940 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61  f locations (via
2f950 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41   fsctl),.** on A
2f960 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20  FP and SMB only 
2f970 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
2f980 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61  ange locks are a
2f990 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63  vailable via fsc
2f9a0 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52  tl.** with _IOWR
2f9b0 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
2f9c0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
2f9d0 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20  2) to track the 
2f9e0 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a  same 5 states..*
2f9f0 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20  * To simulate a 
2fa00 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73  F_RDLCK on the s
2fa10 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20  hared range, on 
2fa20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73  AFP a randomly s
2fa30 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65  elected.** addre
2fa40 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64  ss in the shared
2fa50 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
2fa60 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63  for a SHARED loc
2fa70 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a  k, the entire.**
2fa80 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
2fa90 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58   taken for an EX
2faa0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a  CLUSIVE lock):.*
2fab0 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e  *.**      PENDIN
2fac0 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78  G_BYTE        0x
2fad0 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20  40000000.**     
2fae0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20   RESERVED_BYTE  
2faf0 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a       0x40000001.
2fb00 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52  **      SHARED_R
2fb10 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30  ANGE        0x40
2fb20 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30  000002 -> 0x4000
2fb30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  0200.**.** This 
2fb40 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68  works well on th
2fb50 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
2fb60 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61  tem, but shows a
2fb70 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20   nearly 100x.** 
2fb80 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64  slowdown in read
2fb90 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20   performance on 
2fba0 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20  AFP because the 
2fbb0 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62  AFP client disab
2fbc0 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20  les.** the read 
2fbd0 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d  cache when byte-
2fbe0 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
2fbf0 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69  present.  Enabli
2fc00 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63  ng the read.** c
2fc10 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63  ache exposes a c
2fc20 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70  ache coherency p
2fc30 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70  roblem that is p
2fc40 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53  resent on all OS
2fc50 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20   X.** supported 
2fc60 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73  network file sys
2fc70 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41  tems.  NFS and A
2fc80 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20  FP both observe 
2fc90 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d  the.** close-to-
2fca0 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66  open semantics f
2fcb0 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68  or ensuring cach
2fcc0 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b  e coherency.** [
2fcd0 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63  http://nfs.sourc
2fce0 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f  eforge.net/#faq_
2fcf0 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20  a8], which does 
2fd00 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a  not effectively.
2fd10 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72  ** address the r
2fd20 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20  equirements for 
2fd30 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62  concurrent datab
2fd40 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75  ase access by mu
2fd50 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72  ltiple.** reader
2fd60 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a  s and writers.**
2fd70 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62   [http://www.nab
2fd80 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f  ble.com/SQLite-o
2fd90 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65  n-NFS-cache-cohe
2fda0 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31  rency-td15655701
2fdb0 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f  .html]..**.** To
2fdc0 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72   address the per
2fdd0 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63  formance and cac
2fde0 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73  he coherency iss
2fdf0 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20  ues, proxy file 
2fe00 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67  locking.** chang
2fe10 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62  es the way datab
2fe20 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f  ase access is co
2fe30 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69  ntrolled by limi
2fe40 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61  ting access to a
2fe50 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20  .** single host 
2fe60 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f  at a time and mo
2fe70 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ving file locks 
2fe80 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62  off of the datab
2fe90 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ase file.** and 
2fea0 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c  onto a proxy fil
2feb0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66  e on the local f
2fec0 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a  ile system.  .**
2fed0 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f  .**.** Using pro
2fee0 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d  xy locks.** ----
2fef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
2ff00 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a  .** C APIs.**.**
2ff10 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
2ff20 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
2ff30 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
2ff40 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
2ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff60 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74        <proxy_pat
2ff70 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  h> | ":auto:");.
2ff80 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
2ff90 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
2ffa0 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f  ame, SQLITE_GET_
2ffb0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26  LOCKPROXYFILE, &
2ffc0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a  <proxy_path>);.*
2ffd0 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67  *.**.** SQL prag
2ffe0 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d  mas.**.**  PRAGM
2fff0 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
30000 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72  k_proxy_file=<pr
30010 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74  oxy_path> | :aut
30020 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  o:.**  PRAGMA [d
30030 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
30040 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53  oxy_file.**.** S
30050 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f  pecifying ":auto
30060 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  :" means that if
30070 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63   there is a conc
30080 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61  h file with a ma
30090 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49  tching.** host I
300a0 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f  D in it, the pro
300b0 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63  xy path in the c
300c0 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
300d0 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73  e used, otherwis
300e0 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74  e.** a proxy pat
300f0 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75  h based on the u
30100 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a  ser's temp dir.*
30110 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f  * (via confstr(_
30120 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
30130 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69  EMP_DIR,...)) wi
30140 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74  ll be used and t
30150 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f  he.** actual pro
30160 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  xy file name is 
30170 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
30180 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68  he name and path
30190 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
301a0 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65  ase file.  For e
301b0 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
301c0 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65      For database
301d0 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65   path "/Users/me
301e0 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20  /foo.db" .**    
301f0 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68     The lock path
30200 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69   will be "<tmpdi
30210 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f  r>/sqliteplocks/
30220 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62  _Users_me_foo.db
30230 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f  :auto:").**.** O
30240 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79  nce a lock proxy
30250 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66   is configured f
30260 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
30270 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e  nnection, it can
30280 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76   not.** be remov
30290 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d  ed, however it m
302a0 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74  ay be switched t
302b0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  o a different pr
302c0 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20  oxy path via.** 
302d0 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28  the above APIs (
302e0 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e  assuming the con
302f0 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62  ch file is not b
30300 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f  eing held by ano
30310 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ther.** connecti
30320 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20  on or process). 
30330 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72  .**.**.** How pr
30340 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  oxy locking work
30350 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
30360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
30370 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f  ** Proxy file lo
30380 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69  cking relies pri
30390 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65  marily on two ne
303a0 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c  w supporting fil
303b0 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  es: .**.**   *  
303c0 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69  conch file to li
303d0 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68  mit access to th
303e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
303f0 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74  to a single host
30400 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69  .**      at a ti
30410 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72  me.**.**   *  pr
30420 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20  oxy file to act 
30430 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74  as a proxy for t
30440 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  he advisory lock
30450 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20  s normally.**   
30460 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20     taken on the 
30470 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54  database.**.** T
30480 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20  he conch file - 
30490 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66  to use a proxy f
304a0 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74  ile, sqlite must
304b0 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65   first "hold the
304c0 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61   conch".** by ta
304d0 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73  king an sqlite-s
304e0 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b  tyle shared lock
304f0 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
30500 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a  le, reading the.
30510 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20  ** contents and 
30520 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f  comparing the ho
30530 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74  st's unique host
30540 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20   ID (see below) 
30550 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78  and lock.** prox
30560 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74  y path against t
30570 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
30580 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20   in the conch.  
30590 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  The conch file i
305a0 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74  s.** stored in t
305b0 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
305c0 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  y as the databas
305d0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
305e0 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70  ile name.** is p
305f0 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74  atterned after t
30600 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30610 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61   name as ".<data
30620 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22  basename>-conch"
30630 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63  ..** If the conc
30640 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  h file does not 
30650 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63  exist, or it's c
30660 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d  ontents do not m
30670 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74  atch the.** host
30680 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79   ID and/or proxy
30690 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20   path, then the 
306a0 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65  lock is escalate
306b0 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  d to an exclusiv
306c0 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68  e.** lock and th
306d0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
306e0 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64  tents is updated
306f0 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49   with the host I
30700 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70  D and proxy.** p
30710 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ath and the lock
30720 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74   is downgraded t
30730 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
30740 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63  again.  If the c
30750 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20  onch.** is held 
30760 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  by another proce
30770 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65  ss (with a share
30780 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63  d lock), the exc
30790 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77  lusive lock.** w
307a0 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c  ill fail and SQL
307b0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
307c0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
307d0 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73  proxy file - a s
307e0 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20  ingle-byte file 
307f0 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76  used for all adv
30800 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73  isory file locks
30810 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b  .** normally tak
30820 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
30830 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20  se file.   This 
30840 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20  allows for safe 
30850 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68  sharing.** of th
30860 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
30870 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61  for multiple rea
30880 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
30890 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
308a0 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20  host (the conch 
308b0 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
308c0 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61  y all use the sa
308d0 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  me local lock fi
308e0 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65  le)..**.** Reque
308f0 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70  sting the lock p
30900 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d  roxy does not im
30910 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74  mediately take t
30920 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a  he conch, it is.
30930 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68  ** only taken wh
30940 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71  en the first req
30950 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74  uest to lock dat
30960 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61  abase file is ma
30970 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61  de.  .** This ma
30980 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74  tches the semant
30990 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69  ics of the tradi
309a0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62  tional locking b
309b0 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a  ehavior, where.*
309c0 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e  * opening a conn
309d0 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61  ection to a data
309e0 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e  base file does n
309f0 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f  ot take a lock o
30a00 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61  n it..** The sha
30a10 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20  red lock and an 
30a20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  open file descri
30a30 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69  ptor are maintai
30a40 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68  ned until .** th
30a50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
30a60 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
30a70 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  closed. .**.** T
30a80 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e  he proxy file an
30a90 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  d the lock file 
30aa0 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65  are never delete
30ab0 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e  d so they only n
30ac0 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65  eed.** to be cre
30ad0 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74  ated the first t
30ae0 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65  ime they are use
30af0 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  d..**.** Configu
30b00 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a  ration options.*
30b10 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
30b20 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53  -------.**.**  S
30b30 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
30b40 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a  XY_LOCKING.**.**
30b50 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20         Database 
30b60 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f  files accessed o
30b70 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  n non-local file
30b80 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20   systems are.** 
30b90 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61        automatica
30ba0 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66  lly configured f
30bb0 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
30bc0 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65  , lock files are
30bd0 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20  .**       named 
30be0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73  automatically us
30bf0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67  ing the same log
30c00 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50  ic as.**       P
30c10 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79  RAGMA lock_proxy
30c20 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a  _file=":auto:".*
30c30 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45  *    .**  SQLITE
30c40 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a  _PROXY_DEBUG.**.
30c50 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73  **       Enables
30c60 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20   the logging of 
30c70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64  error messages d
30c80 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69  uring host id fi
30c90 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72  le.**       retr
30ca0 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69  ieval and creati
30cb0 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52  on.**.**  LOCKPR
30cc0 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20  OXYDIR.**.**    
30cd0 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65     Overrides the
30ce0 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f   default directo
30cf0 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ry used for lock
30d00 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61   proxy files tha
30d10 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e  t.**       are n
30d20 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
30d30 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74  ly via the ":aut
30d40 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a  o:" setting.**.*
30d50 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  *  SQLITE_DEFAUL
30d60 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
30d70 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20  SSIONS.**.**    
30d80 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74     Permissions t
30d90 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74  o use when creat
30da0 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
30db0 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a  for storing the.
30dc0 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72  **       lock pr
30dd0 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20  oxy files, only 
30de0 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52  used when LOCKPR
30df0 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65  OXYDIR is not se
30e00 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20  t..**    .**    
30e10 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64  .** As mentioned
30e20 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d   above, when com
30e30 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
30e40 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
30e50 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69  OCKING,.** setti
30e60 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  ng the environme
30e70 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49  nt variable SQLI
30e80 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
30e90 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c  OCKING to 1 will
30ea0 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20  .** force proxy 
30eb0 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73  locking to be us
30ec0 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  ed for every dat
30ed0 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65  abase file opene
30ee0 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c  d, and 0.** will
30ef0 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63   force automatic
30f00 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74   proxy locking t
30f10 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f  o be disabled fo
30f20 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
30f30 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69  * files (explici
30f40 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53  ty calling the S
30f50 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
30f60 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f  OXYFILE pragma o
30f70 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65  r.** sqlite_file
30f80 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20  _control API is 
30f90 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20  not affected by 
30fa0 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
30fb0 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a  XY_LOCKING)..*/.
30fc0 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  ./*.** Proxy loc
30fd0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
30fe0 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
30ff0 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
31000 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
31010 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
31020 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a  KING_STYLE../*.*
31030 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69  * The proxyLocki
31040 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68  ngContext has th
31050 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20  e path and file 
31060 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74  structures for t
31070 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e  he remote .** an
31080 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69  d local proxy fi
31090 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70  les in it.*/.typ
310a0 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78  edef struct prox
310b0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
310c0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
310d0 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78  ext;.struct prox
310e0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
310f0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  {.  unixFile *co
31100 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
31110 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66   /* Open conch f
31120 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ile */.  char *c
31130 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20  onchFilePath;   
31140 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
31150 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
31160 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  */.  unixFile *l
31170 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20  ockProxy;       
31180 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20    /* Open proxy 
31190 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
311a0 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61  har *lockProxyPa
311b0 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
311c0 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79  ame of the proxy
311d0 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
311e0 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
311f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31200 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
31210 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63   file */.  int c
31220 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20  onchHeld;       
31230 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20          /* 1 if 
31240 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c  the conch is hel
31250 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73  d, -1 if lockles
31260 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64  s */.  void *old
31270 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  LockingContext; 
31280 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
31290 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74  lockingcontext t
312a0 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f  o restore on clo
312b0 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
312c0 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
312d0 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20   *pOldMethod;   
312e0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f    /* Original I/
312f0 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c  O methods for cl
31300 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ose */.};../* .*
31310 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
31320 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74   file path for t
31330 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64  he database at d
31340 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  bPath is written
31350 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a   into lPath, .**
31360 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e   which must poin
31370 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74  t to valid, writ
31380 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67  able memory larg
31390 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d  e enough for a m
313a0 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20  axLen length.** 
313b0 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73  file path. .*/.s
313c0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
313d0 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
313e0 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
313f0 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
31400 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
31410 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
31420 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
31430 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
31440 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
31450 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
31460 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
31470 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
31480 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
31490 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69  MP_DIR.  {.    i
314a0 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f  f( !confstr(_CS_
314b0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
314c0 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
314d0 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53  Len) ){.      OS
314e0 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
314f0 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65  ATH  failed %s e
31500 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e  rrno=%d pid=%d\n
31510 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
31520 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20    lPath, errno, 
31530 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
31540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31550 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
31560 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  }.    len = strl
31570 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69  cat(lPath, "sqli
31580 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65  teplocks", maxLe
31590 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c  n);    .  }.# el
315a0 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  se.  len = strlc
315b0 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f  py(lPath, "/tmp/
315c0 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e  ", maxLen);.# en
315d0 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  dif.#endif..  if
315e0 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d  ( lPath[len-1]!=
315f0 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  '/' ){.    len =
31600 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
31610 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  "/", maxLen);.  
31620 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66  }.  .  /* transf
31630 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20  orm the db path 
31640 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68  to a unique cach
31650 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65  e name */.  dbLe
31660 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
31670 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20  dbPath);.  for( 
31680 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20  i=0; i<dbLen && 
31690 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d  (i+len+7)<(int)m
316a0 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  axLen; i++){.   
316b0 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68   char c = dbPath
316c0 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69  [i];.    lPath[i
316d0 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29  +len] = (c=='/')
316e0 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50  ?'_':c;.  }.  lP
316f0 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b  ath[i+len]='\0';
31700 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68  .  strlcat(lPath
31710 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c  , ":auto:", maxL
31720 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  en);.  OSTRACE((
31730 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72  "GETLOCKPATH  pr
31740 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
31750 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74   pid=%d\n", lPat
31760 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
31770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31780 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72  K;.}../* . ** Cr
31790 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66  eates the lock f
317a0 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73  ile and any miss
317b0 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20  ing directories 
317c0 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a  in lockPath. */.
317d0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
317e0 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63  CreateLockPath(c
317f0 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50  onst char *lockP
31800 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c  ath){.  int i, l
31810 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d  en;.  char buf[M
31820 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e  AXPATHLEN];.  in
31830 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a  t start = 0;.  .
31840 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74    assert(lockPat
31850 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74  h!=NULL);.  /* t
31860 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c  ry to create all
31870 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
31880 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f  e directories */
31890 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74  .  len = (int)st
318a0 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a  rlen(lockPath);.
318b0 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50    buf[0] = lockP
318c0 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69  ath[0];.  for( i
318d0 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29  =1; i<len; i++ )
318e0 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61  {.    if( lockPa
318f0 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20  th[i] == '/' && 
31900 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20  (i - start > 0) 
31910 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  ){.      /* only
31920 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64   mkdir if leaf d
31930 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22  ir != "." or "/"
31940 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20   or ".." */.    
31950 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20    if( i-start>2 
31960 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26  || (i-start==1 &
31970 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
31980 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
31990 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20  ] != '/') .     
319a0 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d      || (i-start=
319b0 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =2 && buf[start]
319c0 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
319d0 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20  tart+1] != '.') 
319e0 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69  ){.        buf[i
319f0 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  ]='\0';.        
31a00 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c  if( osMkdir(buf,
31a10 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
31a20 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
31a30 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20  IONS) ){.       
31a40 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
31a50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31a60 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a  err!=EEXIST ) {.
31a70 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52              OSTR
31a80 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
31a90 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65  PATH  FAILED cre
31aa0 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20  ating %s, ".    
31ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ac0 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63   "'%s' proxy loc
31ad0 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
31ae0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
31af0 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73            buf, s
31b00 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f  trerror(err), lo
31b10 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29  ckPath, getpid()
31b20 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
31b30 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20  return err;.    
31b40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31b50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
31b60 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d  start=i+1;.    }
31b70 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f  .    buf[i] = lo
31b80 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20  ckPath[i];.  }. 
31b90 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54   OSTRACE(("CREAT
31ba0 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  ELOCKPATH  proxy
31bb0 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
31bc0 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74  d=%d\n", lockPat
31bd0 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
31be0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
31bf0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
31c00 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69   VFS file descri
31c10 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20  ptor (stored in 
31c20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
31c30 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  from.** sqlite3_
31c40 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e  malloc) and open
31c50 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20   the file named 
31c60 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69  "path" in the fi
31c70 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
31c80 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
31c90 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e  is responsible n
31ca0 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73  ot only for clos
31cb0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73  ing the file des
31cc0 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61  criptor.** but a
31cd0 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20  lso for freeing 
31ce0 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  the memory assoc
31cf0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
31d00 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
31d10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
31d20 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c  oxyCreateUnixFil
31d30 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e(.    const cha
31d40 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20  r *path,        
31d50 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20  /* path for the 
31d60 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a  new unixFile */.
31d70 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70      unixFile **p
31d80 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20  pFile,       /* 
31d90 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64  unixFile created
31da0 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79   and returned by
31db0 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20   ref */.    int 
31dc0 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20  islockfile      
31dd0 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a       /* if non z
31de0 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73  ero missing dirs
31df0 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
31e00 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64   */.) {.  int fd
31e10 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c   = -1;.  unixFil
31e20 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  e *pNew;.  int r
31e30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31e40 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
31e50 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
31e60 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  T;.  sqlite3_vfs
31e70 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74   dummyVfs;.  int
31e80 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55   terrno = 0;.  U
31e90 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
31ea0 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  used = NULL;..  
31eb0 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20  /* 1. first try 
31ec0 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
31ed0 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20  he file.  ** 2. 
31ee0 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61  if that fails, a
31ef0 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63  nd this is a loc
31f00 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63  k file (not-conc
31f10 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67  h), try creating
31f20 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74  .  ** the parent
31f30 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64   directories and
31f40 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e   then try again.
31f50 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74  .  ** 3. if that
31f60 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f   fails, try to o
31f70 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61  pen the file rea
31f80 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65  d-only.  ** othe
31f90 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53  rwise return BUS
31fa0 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29  Y (if lock file)
31fb0 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72   or CANTOPEN for
31fc0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a   the conch file.
31fd0 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d    */.  pUnused =
31fe0 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
31ff0 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29  path, openFlags)
32000 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20  ;.  if( pUnused 
32010 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75  ){.    fd = pUnu
32020 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65  sed->fd;.  }else
32030 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  {.    pUnused = 
32040 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
32050 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
32060 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73  ;.    if( !pUnus
32070 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ed ){.      retu
32080 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
32090 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
320a0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20   fd<0 ){.    fd 
320b0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
320c0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30  th, openFlags, 0
320d0 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20  );.    terrno = 
320e0 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66  errno;.    if( f
320f0 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  d<0 && errno==EN
32100 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69  OENT && islockfi
32110 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
32120 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50  proxyCreateLockP
32130 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c  ath(path) == SQL
32140 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32150 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
32160 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
32170 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  gs, 0);.      }.
32180 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
32190 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  fd<0 ){.    open
321a0 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59  Flags = O_RDONLY
321b0 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
321c0 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65  t_open(path, ope
321d0 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20  nFlags, 0);.    
321e0 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  terrno = errno;.
321f0 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
32200 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b  {.    if( islock
32210 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65  file ){.      re
32220 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
32230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
32240 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20  ch (terrno) {.  
32250 20 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a      case EACCES:
32260 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
32270 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
32280 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20     case EIO: .  
32290 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
322a0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20  ITE_IOERR_LOCK; 
322b0 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  /* even though i
322c0 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a  t is the conch *
322d0 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  /.      default:
322e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
322f0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
32300 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
32310 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69    .  pNew = (uni
32320 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f  xFile *)sqlite3_
32330 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
32340 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  New));.  if( pNe
32350 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72  w==NULL ){.    r
32360 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
32370 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63  ;.    goto end_c
32380 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d  reate_proxy;.  }
32390 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
323a0 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
323b0 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  le));.  pNew->op
323c0 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
323d0 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ags;.  memset(&d
323e0 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65  ummyVfs, 0, size
323f0 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20  of(dummyVfs));. 
32400 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61   dummyVfs.pAppDa
32410 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74  ta = (void*)&aut
32420 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20  olockIoFinder;. 
32430 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20   dummyVfs.zName 
32440 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e  = "dummy";.  pUn
32450 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  used->fd = fd;. 
32460 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20   pUnused->flags 
32470 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70  = openFlags;.  p
32480 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  New->pUnused = p
32490 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20  Unused;.  .  rc 
324a0 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
324b0 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20  (&dummyVfs, fd, 
324c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
324d0 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20  New, path, 0);. 
324e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
324f0 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c  OK ){.    *ppFil
32500 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65  e = pNew;.    re
32510 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
32520 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70    }.end_create_p
32530 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75  roxy:    .  robu
32540 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66  st_close(pNew, f
32550 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
32560 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
32570 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  w);.  sqlite3_fr
32580 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72  ee(pUnused);.  r
32590 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
325a0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
325b0 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
325c0 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
325d0 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
325e0 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
325f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68  */.int sqlite3_h
32600 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23  ostid_num = 0;.#
32610 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50  endif..#define P
32620 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20  ROXY_HOSTIDLEN  
32630 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66    16  /* conch f
32640 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67  ile host id leng
32650 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c  th */../* Not al
32660 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20  ways defined in 
32670 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69  the headers as i
32680 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f  t ought to be */
32690 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68  .extern int geth
326a0 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69  ostuuid(uuid_t i
326b0 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  d, const struct 
326c0 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b  timespec *wait);
326d0 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73  ../* get the hos
326e0 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74  t ID via gethost
326f0 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20  uuid(), pHostID 
32700 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52  must point to PR
32710 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a  OXY_HOSTIDLEN .*
32720 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61  * bytes of writa
32730 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ble memory..*/.s
32740 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
32750 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65  etHostID(unsigne
32760 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c  d char *pHostID,
32770 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20   int *pError){. 
32780 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f   assert(PROXY_HO
32790 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f  STIDLEN == sizeo
327a0 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65  f(uuid_t));.  me
327b0 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c  mset(pHostID, 0,
327c0 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
327d0 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  );.#if defined(_
327e0 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAX_OS_X_VERSIO
327f0 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29 5c  N_MIN_REQUIRED)\
32800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32810 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45  && __MAC_OS_X_VE
32820 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52  RSION_MIN_REQUIR
32830 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20 20  ED<1050.  {.    
32840 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
32850 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d  uct timespec tim
32860 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f  eout = {1, 0}; /
32870 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20  * 1 sec timeout 
32880 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f  */.    if( getho
32890 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20  stuuid(pHostID, 
328a0 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20  &timeout) ){.   
328b0 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72     int err = err
328c0 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  no;.      if( pE
328d0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
328e0 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20  *pError = err;. 
328f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
32900 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
32910 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
32920 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
32930 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65  ETER(pError);.#e
32940 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
32950 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d  TE_TEST.  /* sim
32960 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
32970 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
32980 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
32990 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69  ile paths */.  i
329a0 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  f( sqlite3_hosti
329b0 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20  d_num != 0){.   
329c0 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63   pHostID[0] = (c
329d0 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20  har)(pHostID[0] 
329e0 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33  + (char)(sqlite3
329f0 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78  _hostid_num & 0x
32a00 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  FF));.  }.#endif
32a10 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  .  .  return SQL
32a20 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
32a30 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
32a40 74 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72  tains the header
32a50 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f  , host id and lo
32a60 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f  ck file path. */
32a70 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43  .#define PROXY_C
32a80 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20  ONCHVERSION 2   
32a90 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72  /* 1-byte header
32aa0 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69  , 16-byte host i
32ab0 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69  d, path */.#defi
32ac0 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  ne PROXY_HEADERL
32ad0 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e  EN    1   /* con
32ae0 63 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c  ch file header l
32af0 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65  ength */.#define
32b00 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
32b10 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45      (PROXY_HEADE
32b20 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
32b30 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52  DLEN).#define PR
32b40 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20  OXY_MAXCONCHLEN 
32b50 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
32b60 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
32b70 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f  N+MAXPATHLEN)../
32b80 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f  * .** Takes an o
32b90 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  pen conch file, 
32ba0 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65  copies the conte
32bb0 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74  nts to a new pat
32bc0 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73  h and then moves
32bd0 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54   .** it back.  T
32be0 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64  he newly created
32bf0 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73   file's file des
32c00 63 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67  criptor is assig
32c10 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  ned to the.** co
32c20 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75  nch file structu
32c30 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74  re and finally t
32c40 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63  he original conc
32c50 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
32c60 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e  r is .** closed.
32c70 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69    Returns zero i
32c80 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f  f successful..*/
32c90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
32ca0 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28  yBreakConchLock(
32cb0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
32cc0 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
32cd0 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
32ce0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
32cf0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
32d00 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
32d10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
32d20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
32d30 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
32d40 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20  nchFile;.  char 
32d50 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  tPath[MAXPATHLEN
32d60 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52  ];.  char buf[PR
32d70 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
32d80 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20  ;.  char *cPath 
32d90 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
32da0 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20  ePath;.  size_t 
32db0 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73  readLen = 0;.  s
32dc0 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20  ize_t pathLen = 
32dd0 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67  0;.  char errmsg
32de0 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74  [64] = "";.  int
32df0 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20   fd = -1;.  int 
32e00 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45  rc = -1;.  UNUSE
32e10 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f  D_PARAMETER(myHo
32e20 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65  stID);..  /* cre
32e30 61 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62  ate a new path b
32e40 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72  y replace the tr
32e50 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20  ailing '-conch' 
32e60 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f  with '-break' */
32e70 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72  .  pathLen = str
32e80 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74  lcpy(tPath, cPat
32e90 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
32ea0 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41    if( pathLen>MA
32eb0 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68  XPATHLEN || path
32ec0 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28  Len<6 || .     (
32ed0 73 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70  strlcpy(&tPath[p
32ee0 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61  athLen-5], "brea
32ef0 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a  k", 6) != 5) ){.
32f00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
32f10 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
32f20 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68  sg),errmsg,"path
32f30 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
32f40 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a  ,(int)pathLen);.
32f50 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
32f60 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
32f70 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20   read the conch 
32f80 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61  content */.  rea
32f90 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63  dLen = osPread(c
32fa0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66  onchFile->h, buf
32fb0 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
32fc0 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  LEN, 0);.  if( r
32fd0 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54  eadLen<PROXY_PAT
32fe0 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71  HINDEX ){.    sq
32ff0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
33000 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72  izeof(errmsg),er
33010 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72  rmsg,"read error
33020 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29   (len %d)",(int)
33030 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  readLen);.    go
33040 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
33050 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65  ;.  }.  /* write
33060 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74   it out to the t
33070 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66  emporary break f
33080 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f  ile */.  fd = ro
33090 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c  bust_open(tPath,
330a0 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54   (O_RDWR|O_CREAT
330b0 7c 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20  |O_EXCL), 0);.  
330c0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
330d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
330e0 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
330f0 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65   errmsg, "create
33100 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
33110 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
33120 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
33130 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74   }.  if( osPwrit
33140 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c  e(fd, buf, readL
33150 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65  en, 0) != (ssize
33160 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20  _t)readLen ){.  
33170 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
33180 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
33190 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74  ), errmsg, "writ
331a0 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
331b0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
331c0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
331d0 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65    }.  if( rename
331e0 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29  (tPath, cPath) )
331f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
33200 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
33210 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
33220 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25  rename failed (%
33230 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
33240 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
33250 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ock;.  }.  rc = 
33260 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  0;.  fprintf(std
33270 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c  err, "broke stal
33280 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c  e lock on %s\n",
33290 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73   cPath);.  robus
332a0 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63  t_close(pFile, c
332b0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  onchFile->h, __L
332c0 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46  INE__);.  conchF
332d0 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63  ile->h = fd;.  c
332e0 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
332f0 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
33300 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65  _CREAT;..end_bre
33310 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63  aklock:.  if( rc
33320 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d   ){.    if( fd>=
33330 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c  0 ){.      osUnl
33340 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20  ink(tPath);.    
33350 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
33360 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  File, fd, __LINE
33370 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  __);.    }.    f
33380 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33390 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20  failed to break 
333a0 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73  stale lock on %s
333b0 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20  , %s\n", cPath, 
333c0 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72  errmsg);.  }.  r
333d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
333e0 54 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74  Take the request
333f0 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63  ed lock on the c
33400 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72  onch file and br
33410 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b  eak a stale lock
33420 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74   if the .** host
33430 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a   id matches..*/.
33440 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
33450 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69  ConchLock(unixFi
33460 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f  le *pFile, uuid_
33470 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20  t myHostID, int 
33480 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f  lockType){.  pro
33490 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
334a0 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
334b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
334c0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
334d0 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69  ntext; .  unixFi
334e0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
334f0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
33500 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33510 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72  TE_OK;.  int nTr
33520 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  ies = 0;.  struc
33530 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68  t timespec conch
33540 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65  ModTime;.  .  me
33550 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69  mset(&conchModTi
33560 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f  me, 0, sizeof(co
33570 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20  nchModTime));.  
33580 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f  do {.    rc = co
33590 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
335a0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
335b0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
335c0 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
335d0 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20   nTries ++;.    
335e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
335f0 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  USY ){.      /* 
33600 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  If the lock fail
33610 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20  ed (busy):.     
33620 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74    * 1st try: get
33630 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66   the mod time of
33640 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74   the conch, wait
33650 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67   0.5s and try ag
33660 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32  ain. .       * 2
33670 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20  nd try: fail if 
33680 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61  the mod time cha
33690 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20  nged or host id 
336a0 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61  is different, wa
336b0 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20  it .       *    
336c0 20 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e         10 sec an
336d0 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20  d try again.    
336e0 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72     * 3rd try: br
336f0 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c  eak the lock unl
33700 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  ess the mod time
33710 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20   has changed..  
33720 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
33730 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
33740 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
33750 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26  (conchFile->h, &
33760 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  buf) ){.        
33770 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
33780 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
33790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
337a0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
337b0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
337c0 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29   if( nTries==1 )
337d0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d  {.        conchM
337e0 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f  odTime = buf.st_
337f0 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20  mtimespec;.     
33800 20 20 20 75 73 6c 65 65 70 28 35 30 30 30 30 30     usleep(500000
33810 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73  ); /* wait 0.5 s
33820 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c  ec and try the l
33830 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20  ock again*/.    
33840 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a      continue;  .
33850 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
33860 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20  ssert( nTries>1 
33870 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e  );.      if( con
33880 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63  chModTime.tv_sec
33890 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
338a0 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a  spec.tv_sec || .
338b0 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f           conchMo
338c0 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d  dTime.tv_nsec !=
338d0 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
338e0 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20  c.tv_nsec ){.   
338f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
33900 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d  TE_BUSY;.      }
33910 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  .      .      if
33920 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20  ( nTries==2 ){  
33930 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 74 42  .        char tB
33940 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
33950 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69  HLEN];.        i
33960 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64  nt len = osPread
33970 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74  (conchFile->h, t
33980 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  Buf, PROXY_MAXCO
33990 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20  NCHLEN, 0);.    
339a0 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b      if( len<0 ){
339b0 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
339c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
339d0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
339e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
339f0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
33a00 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
33a10 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en>PROXY_PATHIND
33a20 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28  EX && tBuf[0]==(
33a30 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
33a40 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20  VERSION){.      
33a50 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65      /* don't bre
33a60 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74  ak the lock if t
33a70 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e  he host id doesn
33a80 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  't match */.    
33a90 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d        if( 0!=mem
33aa0 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f  cmp(&tBuf[PROXY_
33ab0 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
33ac0 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54  stID, PROXY_HOST
33ad0 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20  IDLEN) ){.      
33ae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
33af0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
33b00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
33b10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
33b20 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68  * don't break th
33b30 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20  e lock on short 
33b40 72 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f  read or a versio
33b50 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20  n mismatch */.  
33b60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
33b70 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
33b80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73      }.        us
33b90 6c 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20  leep(10000000); 
33ba0 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61  /* wait 10 sec a
33bb0 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
33bc0 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20  again */.       
33bd0 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20   continue; .    
33be0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
33bf0 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d   assert( nTries=
33c00 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =3 );.      if( 
33c10 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e  0==proxyBreakCon
33c20 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
33c30 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20  HostID) ){.     
33c40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
33c50 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  K;.        if( l
33c60 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49  ockType==EXCLUSI
33c70 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
33c80 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
33c90 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
33ca0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
33cb0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48  e*)conchFile, SH
33cc0 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20  ARED_LOCK);     
33cd0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
33ce0 20 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20          if( !rc 
33cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
33d00 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
33d10 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
33d20 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
33d30 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  File, lockType);
33d40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33d50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69   }.    }.  } whi
33d60 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
33d70 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20  USY && nTries<3 
33d80 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72  );.  .  return r
33d90 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74  c;.}../* Takes t
33da0 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69  he conch by taki
33db0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
33dc0 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f   and read the co
33dd0 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66  ntents conch, if
33de0 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73   .** lockPath is
33df0 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68   non-NULL, the h
33e00 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20  ost ID and lock 
33e10 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d  file path must m
33e20 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a  atch.  A NULL .*
33e30 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73  * lockPath means
33e40 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61   that the lockPa
33e50 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
33e60 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
33e70 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73  d if the .** hos
33e80 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20  t IDs match, or 
33e90 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20  a new lock path 
33ea0 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
33eb0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
33ec0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20  .** and written 
33ed0 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  to the conch fil
33ee0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
33ef0 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
33f00 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
33f10 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
33f20 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
33f30 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
33f40 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
33f50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
33f60 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f   .  if( pCtx->co
33f70 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20  nchHeld!=0 ){.  
33f80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33f90 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
33fa0 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
33fb0 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
33fc0 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64  chFile;.    uuid
33fd0 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20  _t myHostID;.   
33fe0 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b   int pError = 0;
33ff0 0a 20 20 20 20 63 68 61 72 20 72 65 61 64 42 75  .    char readBu
34000 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
34010 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c  LEN];.    char l
34020 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  ockPath[MAXPATHL
34030 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74  EN];.    char *t
34040 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55  empLockPath = NU
34050 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  LL;.    int rc =
34060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
34070 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20  int createConch 
34080 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73  = 0;.    int hos
34090 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20  tIdMatch = 0;.  
340a0 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20    int readLen = 
340b0 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c  0;.    int tryOl
340c0 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  dLockPath = 0;. 
340d0 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c     int forceNewL
340e0 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
340f0 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22   .    OSTRACE(("
34100 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f  TAKECONCH  %d fo
34110 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
34120 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
34130 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78             (pCtx
34140 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
34150 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ? pCtx->lockProx
34160 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22  yPath : ":auto:"
34170 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a  ), getpid()));..
34180 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65      rc = proxyGe
34190 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44  tHostID(myHostID
341a0 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20  , &pError);.    
341b0 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  if( (rc&0xff)==S
341c0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
341d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
341e0 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a  Errno = pError;.
341f0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
34200 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
34210 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f      rc = proxyCo
34220 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
34230 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f  yHostID, SHARED_
34240 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
34250 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34260 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
34270 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
34280 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20      /* read the 
34290 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66  existing conch f
342a0 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c  ile */.    readL
342b0 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  en = seekAndRead
342c0 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63  ((unixFile*)conc
342d0 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75  hFile, 0, readBu
342e0 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
342f0 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72  HLEN);.    if( r
34300 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  eadLen<0 ){.    
34310 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20    /* I/O error: 
34320 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
34330 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
34340 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
34350 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69  tErrno = conchFi
34360 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
34370 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
34380 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20  _IOERR_READ;.   
34390 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
343a0 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65  conch;.    }else
343b0 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50   if( readLen<=(P
343c0 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
343d0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20  ROXY_HOSTIDLEN) 
343e0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
343f0 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68   readBuf[0]!=(ch
34400 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
34410 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f  RSION ){.      /
34420 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f  * a short read o
34430 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74  r version format
34440 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20   mismatch means 
34450 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
34460 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a  e a new .      *
34470 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20  * conch file. . 
34480 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72       */.      cr
34490 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20  eateConch = 1;. 
344a0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74     }.    /* if t
344b0 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  he host id match
344c0 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  es and the lock 
344d0 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 78 69  path already exi
344e0 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  sts in the conch
344f0 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72  .    ** we'll tr
34500 79 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 74  y to use the pat
34510 68 20 74 68 65 72 65 2c 20 69 66 20 77 65 20 63  h there, if we c
34520 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70  an't open that p
34530 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20  ath, we'll .    
34540 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20 61 20  ** retry with a 
34550 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74  new auto-generat
34560 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a  ed path .    */.
34570 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63      do { /* in c
34580 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74  ase we need to t
34590 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20  ry again for an 
345a0 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63  :auto: named loc
345b0 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  k file */..     
345c0 20 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63   if( !createConc
345d0 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f  h && !forceNewLo
345e0 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  ckPath ){.      
345f0 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20    hostIdMatch = 
34600 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66  !memcmp(&readBuf
34610 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
34620 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20  ], myHostID, .  
34630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34650 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
34660 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20  ;.        /* if 
34670 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61  the conch has da
34680 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  ta compare the c
34690 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  ontents */.     
346a0 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
346b0 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
346c0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20           /* for 
346d0 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c  auto-named local
346e0 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74   lock file, just
346f0 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20   check the host 
34700 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20  ID and we'll.   
34710 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74          ** use t
34720 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  he local lock fi
34730 6c 65 20 70 61 74 68 20 74 68 61 74 27 73 20 61  le path that's a
34740 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a  lready in there.
34750 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
34760 20 20 20 20 20 20 20 20 69 66 28 20 68 6f 73 74          if( host
34770 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  IdMatch ){.     
34780 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61         size_t pa
34790 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e  thLen = (readLen
347a0 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44   - PROXY_PATHIND
347b0 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  EX);.           
347c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66   .            if
347d0 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41  ( pathLen>=MAXPA
347e0 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  THLEN ){.       
347f0 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d         pathLen=M
34800 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20  AXPATHLEN-1;.   
34810 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34820 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f         memcpy(lo
34830 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75 66  ckPath, &readBuf
34840 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
34850 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20  ], pathLen);.   
34860 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74           lockPat
34870 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a  h[pathLen] = 0;.
34880 20 20 20 20 20 20 20 20 20 20 20 20 74 65 6d 70              temp
34890 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
348a0 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ath;.           
348b0 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
348c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
348d0 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70   /* create a cop
348e0 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61  y of the lock pa
348f0 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  th if the conch 
34900 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20  is taken */.    
34910 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
34920 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
34930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34940 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64  }else if( hostId
34950 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20  Match.          
34960 20 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70       && !strncmp
34970 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
34980 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50  Path, &readBuf[P
34990 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c  ROXY_PATHINDEX],
349a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
349b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
349c0 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e  Len-PROXY_PATHIN
349d0 44 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  DEX).        ){.
349e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e            /* con
349f0 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b  ch host and lock
34a00 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20   path match */. 
34a10 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
34a20 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20  d_takeconch; .  
34a30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34a40 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
34a50 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e  if the conch isn
34a60 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20  't writable and 
34a70 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77  doesn't match, w
34a80 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20  e can't take it 
34a90 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f  */.      if( (co
34aa0 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
34ab0 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20  gs&O_RDWR) == 0 
34ac0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
34ad0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
34ae0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
34af0 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d  keconch;.      }
34b00 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
34b10 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63   either the conc
34b20 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f  h didn't match o
34b30 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  r we need to cre
34b40 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f  ate a new one */
34b50 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78  .      if( !pCtx
34b60 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
34b70 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  ){.        proxy
34b80 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78  GetLockPath(pCtx
34b90 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61  ->dbPath, lockPa
34ba0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
34bb0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63  .        tempLoc
34bc0 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68  kPath = lockPath
34bd0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65  ;.        /* cre
34be0 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
34bf0 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c  e lock path _onl
34c00 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  y_ if the conch 
34c10 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20  is taken */.    
34c20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
34c30 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68   /* update conch
34c40 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70   with host and p
34c50 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66  ath (this will f
34c60 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f  ail if other pro
34c70 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61  cess.      ** ha
34c80 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
34c90 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68 65  already), if the
34ca0 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
34cb0 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a 20 20  , use the big.  
34cc0 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20      ** stick..  
34cd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74      */.      fut
34ce0 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  imes(conchFile->
34cf0 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  h, NULL);.      
34d00 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20  if( hostIdMatch 
34d10 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20  && !createConch 
34d20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
34d30 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  onchFile->pInode
34d40 20 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70   && conchFile->p
34d50 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
34d60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
34d70 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
34d80 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
34d90 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
34da0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
34db0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
34dc0 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
34dd0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
34de0 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
34df0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
34e00 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
34e10 20 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20    } else {      
34e20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 72      .          r
34e30 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  c = proxyConchLo
34e40 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
34e50 49 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ID, EXCLUSIVE_LO
34e60 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
34e70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34e80 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
34e90 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
34ea0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
34eb0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43  *)conchFile, EXC
34ec0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
34ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
34ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34ef0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 77 72  .        char wr
34f00 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
34f10 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
34f20 20 20 20 20 20 20 69 6e 74 20 77 72 69 74 65 53        int writeS
34f30 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ize = 0;.       
34f40 20 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 42   .        writeB
34f50 75 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72  uffer[0] = (char
34f60 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
34f70 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ION;.        mem
34f80 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72  cpy(&writeBuffer
34f90 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
34fa0 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f  ], myHostID, PRO
34fb0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20  XY_HOSTIDLEN);. 
34fc0 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
34fd0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21 3d  >lockProxyPath!=
34fe0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
34ff0 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65    strlcpy(&write
35000 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54  Buffer[PROXY_PAT
35010 48 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c  HINDEX], pCtx->l
35020 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41  ockProxyPath, MA
35030 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
35040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35050 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69      strlcpy(&wri
35060 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
35070 41 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c  ATHINDEX], tempL
35080 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ockPath, MAXPATH
35090 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LEN);.        }.
350a0 20 20 20 20 20 20 20 20 77 72 69 74 65 53 69 7a          writeSiz
350b0 65 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  e = PROXY_PATHIN
350c0 44 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72  DEX + strlen(&wr
350d0 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
350e0 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20  PATHINDEX]);.   
350f0 20 20 20 20 20 72 6f 62 75 73 74 5f 66 74 72 75       robust_ftru
35100 6e 63 61 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d  ncate(conchFile-
35110 3e 68 2c 20 77 72 69 74 65 53 69 7a 65 29 3b 0a  >h, writeSize);.
35120 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
35130 78 57 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f  xWrite((sqlite3_
35140 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65  file *)conchFile
35150 2c 20 77 72 69 74 65 42 75 66 66 65 72 2c 20 77  , writeBuffer, w
35160 72 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20  riteSize, 0);.  
35170 20 20 20 20 20 20 66 73 79 6e 63 28 63 6f 6e 63        fsync(conc
35180 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20  hFile->h);.     
35190 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61     /* If we crea
351a0 74 65 64 20 61 20 6e 65 77 20 63 6f 6e 63 68 20  ted a new conch 
351b0 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74 20 75  file (not just u
351c0 70 64 61 74 65 64 20 74 68 65 20 63 6f 6e 74 65  pdated the conte
351d0 6e 74 73 20 6f 66 20 61 20 0a 20 20 20 20 20 20  nts of a .      
351e0 20 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f 6e 63     ** valid conc
351f0 68 20 66 69 6c 65 29 2c 20 74 72 79 20 74 6f 20  h file), try to 
35200 6d 61 74 63 68 20 74 68 65 20 70 65 72 6d 69 73  match the permis
35210 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 61 74  sions of the dat
35220 61 62 61 73 65 20 0a 20 20 20 20 20 20 20 20 20  abase .         
35230 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
35240 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
35250 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20  createConch ){. 
35260 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
35270 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20  stat buf;.      
35280 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 6f 73      int err = os
35290 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
352a0 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  &buf);.         
352b0 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20   if( err==0 ){. 
352c0 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 5f             mode_
352d0 74 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74  t cmode = buf.st
352e0 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53 52 7c 53  _mode&(S_IRUSR|S
352f0 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47 52 50  _IWUSR | S_IRGRP
35300 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20 20 20 20  |S_IWGRP |.     
35310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35330 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f     S_IROTH|S_IWO
35340 54 48 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  TH);.           
35350 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74 63 68   /* try to match
35360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35370 6c 65 20 52 2f 57 20 70 65 72 6d 69 73 73 69 6f  le R/W permissio
35380 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75  ns, ignore failu
35390 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  re */.#ifndef SQ
353a0 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47  LITE_PROXY_DEBUG
353b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 46  .            osF
353c0 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d  chmod(conchFile-
353d0 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73  >h, cmode);.#els
353e0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f  e.            do
353f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
35400 72 63 20 3d 20 6f 73 46 63 68 6d 6f 64 28 63 6f  rc = osFchmod(co
35410 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64  nchFile->h, cmod
35420 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
35430 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28 2d 31 29  }while( rc==(-1)
35440 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
35450 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
35460 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
35470 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63             int c
35480 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  ode = errno;.   
35490 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
354a0 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d  tf(stderr, "fchm
354b0 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69 74  od %o FAILED wit
354c0 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  h %d %s\n",.    
354d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354e0 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73    cmode, code, s
354f0 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a  trerror(code));.
35500 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
35510 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
35520 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
35530 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55  r, "fchmod %o SU
35540 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29  CCEDED\n",cmode)
35550 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
35560 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
35570 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
35580 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20   code = errno;. 
35590 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
355a0 74 66 28 73 74 64 65 72 72 2c 20 22 53 54 41 54  tf(stderr, "STAT
355b0 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68   FAILED[%d] with
355c0 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20   %d %s\n", .    
355d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355e0 65 72 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72  err, code, strer
355f0 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64  ror(code));.#end
35600 69 66 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  if.          }. 
35610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35620 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65  .      conchFile
35630 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
35640 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
35650 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41  *)conchFile, SHA
35660 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
35670 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f   .    end_takeco
35680 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53 54 52 41  nch:.      OSTRA
35690 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a  CE(("TRANSPROXY:
356a0 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70   CLOSE  %d\n", p
356b0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
356c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
356d0 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65  OK && pFile->ope
356e0 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  nFlags ){.      
356f0 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 20 20    int fd;.      
35700 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d    if( pFile->h>=
35710 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
35720 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
35730 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  e, pFile->h, __L
35740 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20  INE__);.        
35750 7d 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  }.        pFile-
35760 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  >h = -1;.       
35770 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
35780 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  n(pCtx->dbPath, 
35790 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
357a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  , 0);.        OS
357b0 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f  TRACE(("TRANSPRO
357c0 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c  XY: OPEN  %d\n",
357d0 20 66 64 29 29 3b 0a 20 20 20 20 20 20 20 20 69   fd));.        i
357e0 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
357f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
35800 20 66 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   fd;.        }el
35810 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
35820 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
35830 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45  _BKPT; /* SQLITE
35840 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65  _BUSY? proxyTake
35850 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20  Conch called.   
35860 20 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 6c          during l
35870 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  ocking */.      
35880 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
35890 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
358a0 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f  _OK && !pCtx->lo
358b0 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20  ckProxy ){.     
358c0 20 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20     char *path = 
358d0 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74  tempLockPath ? t
358e0 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43  empLockPath : pC
358f0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
35900 68 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  h;.        rc = 
35910 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46  proxyCreateUnixF
35920 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d  ile(path, &pCtx-
35930 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a  >lockProxy, 1);.
35940 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
35950 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
35960 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26  =SQLITE_NOMEM &&
35970 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
35980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
35990 77 65 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61  we couldn't crea
359a0 74 65 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  te the proxy loc
359b0 6b 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  k file with the 
359c0 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  old lock file pa
359d0 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a  th.           **
359e0 20 73 6f 20 74 72 79 20 61 67 61 69 6e 20 76 69   so try again vi
359f0 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20  a auto-naming . 
35a00 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
35a10 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c         forceNewL
35a20 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20  ockPath = 1;.   
35a30 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63         tryOldLoc
35a40 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  kPath = 0;.     
35a50 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
35a60 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20 74 68 65  * go back to the
35a70 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74 61   do {} while sta
35a80 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20 61 67  rt point, try ag
35a90 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ain */.        }
35aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
35ab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
35ad0 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f  eed to make a co
35ae0 70 79 20 6f 66 20 70 61 74 68 20 69 66 20 77 65  py of path if we
35af0 20 65 78 74 72 61 63 74 65 64 20 74 68 65 20 76   extracted the v
35b00 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20 2a 2a  alue.         **
35b10 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20   from the conch 
35b20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 61 74 68  file or the path
35b30 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f   was allocated o
35b40 6e 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20  n the stack.    
35b50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
35b60 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  if( tempLockPath
35b70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
35b80 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
35b90 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
35ba0 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50  Dup(0, tempLockP
35bb0 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ath);.          
35bc0 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50  if( !pCtx->lockP
35bd0 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
35be0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
35bf0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
35c00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
35c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
35c20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35c30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78   ){.        pCtx
35c40 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b  ->conchHeld = 1;
35c50 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
35c60 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b    if( pCtx->lock
35c70 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d  Proxy->pMethod =
35c80 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
35c90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70  ){.          afp
35ca0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
35cb0 61 66 70 43 74 78 3b 0a 20 20 20 20 20 20 20 20  afpCtx;.        
35cc0 20 20 61 66 70 43 74 78 20 3d 20 28 61 66 70 4c    afpCtx = (afpL
35cd0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
35ce0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d  pCtx->lockProxy-
35cf0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
35d00 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74  .          afpCt
35d10 78 2d 3e 64 62 50 61 74 68 20 3d 20 70 43 74 78  x->dbPath = pCtx
35d20 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
35d30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35d40 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
35d50 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65    conchFile->pMe
35d60 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
35d70 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
35d80 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29  chFile, NO_LOCK)
35d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35da0 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f  OSTRACE(("TAKECO
35db0 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63  NCH  %d %s\n", c
35dc0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d              rc==
35de0 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22  SQLITE_OK?"ok":"
35df0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
35e00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
35e10 7d 20 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20  } while (1); /* 
35e20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20  in case we need 
35e30 74 6f 20 72 65 74 72 79 20 74 68 65 20 3a 61 75  to retry the :au
35e40 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20  to: lock file - 
35e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35e60 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 6e    ** we should n
35e70 65 76 65 72 20 67 65 74 20 68 65 72 65 20 65 78  ever get here ex
35e80 63 65 70 74 20 76 69 61 20 74 68 65 20 27 63 6f  cept via the 'co
35e90 6e 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f  ntinue' call. */
35ea0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
35eb0 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61 20 6c   pFile holds a l
35ec0 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20 66  ock on a conch f
35ed0 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65 61 73  ile, then releas
35ee0 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e that lock..*/.
35ef0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
35f00 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e 69  ReleaseConch(uni
35f10 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
35f20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
35f30 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
35f40 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  Subroutine retur
35f50 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f 78  n code */.  prox
35f60 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
35f70 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65 20 6c  *pCtx;  /* The l
35f80 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 66  ocking context f
35f90 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  or the proxy loc
35fa0 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  k */.  unixFile 
35fb0 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20  *conchFile;     
35fc0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
35fd0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  e conch file */.
35fe0 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f 78 79  .  pCtx = (proxy
35ff0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
36000 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
36010 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68 46  ontext;.  conchF
36020 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
36030 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43 45  hFile;.  OSTRACE
36040 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20  (("RELEASECONCH 
36050 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25   %d for %s pid=%
36060 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  d\n", conchFile-
36070 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
36080 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
36090 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath ? pCtx->lock
360a0 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75  ProxyPath : ":au
360b0 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20 20 20  to:"), .        
360c0 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20     getpid()));. 
360d0 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
360e0 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72 63  Held>0 ){.    rc
360f0 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
36100 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
36110 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
36120 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b  nchFile, NO_LOCK
36130 29 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e 63  );.  }.  pCtx->c
36140 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20  onchHeld = 0;.  
36150 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45 41 53  OSTRACE(("RELEAS
36160 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22  ECONCH  %d %s\n"
36170 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
36180 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d             (rc==
36190 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
361a0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a   : "failed")));.
361b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
361c0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
361d0 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
361e0 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65  se file, compute
361f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73   the name of its
36200 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20   conch file..** 
36210 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20  Store the conch 
36220 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f  filename in memo
36230 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
36240 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
36250 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e  )..** Make *pCon
36260 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20  chPath point to 
36270 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52  the new name.  R
36280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
36290 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
362a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
362b0 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69   unable to obtai
362c0 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  n memory..**.** 
362d0 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
362e0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
362f0 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20  suring that the 
36300 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
36310 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76 65  .** space is eve
36320 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  ntually freed..*
36330 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68  *.** *pConchPath
36340 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
36350 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  if a memory allo
36360 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
36370 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
36380 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f  nt proxyCreateCo
36390 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72  nchPathname(char
363a0 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
363b0 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20  *pConchPath){.  
363c0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
363d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
363e0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
363f0 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e  .  int len = (in
36400 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29  t)strlen(dbPath)
36410 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64  ; /* Length of d
36420 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
36430 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20 63   - dbPath */.  c
36440 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20  har *conchPath; 
36450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36460 62 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20  buffer in which 
36470 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e  to construct con
36480 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a  ch name */..  /*
36490 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
364a0 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
364b0 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74 69  lename and initi
364c0 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 74  alize the name t
364d0 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20  o.  ** the name 
364e0 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
364f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
36500 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74  /  .  *pConchPat
36510 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d 20  h = conchPath = 
36520 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
36530 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b  malloc(len + 8);
36540 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68  .  if( conchPath
36550 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
36560 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
36570 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e    }.  memcpy(con
36580 63 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20  chPath, dbPath, 
36590 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20  len+1);.  .  /* 
365a0 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22  now insert a "."
365b0 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74   before the last
365c0 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a   / character */.
365d0 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29    for( i=(len-1)
365e0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20  ; i>=0; i-- ){. 
365f0 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68     if( conchPath
36600 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
36610 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65    i++;.      bre
36620 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
36630 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27  conchPath[i]='.'
36640 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65  ;.  while ( i<le
36650 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61  n ){.    conchPa
36660 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69  th[i+1]=dbPath[i
36670 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  ];.    i++;.  }.
36680 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65  .  /* append the
36690 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78   "-conch" suffix
366a0 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   to the file */.
366b0 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50    memcpy(&conchP
366c0 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63  ath[i+1], "-conc
366d0 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72 74  h", 7);.  assert
366e0 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f  ( (int)strlen(co
366f0 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b  nchPath) == len+
36700 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  7 );..  return S
36710 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
36720 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20 63   Takes a fully c
36730 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79 20  onfigured proxy 
36740 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e  locking-style un
36750 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69 74  ix file and swit
36760 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61  ches.** the loca
36770 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  l lock file path
36780 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
36790 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50  switchLockProxyP
367a0 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ath(unixFile *pF
367b0 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ile, const char 
367c0 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79  *path) {.  proxy
367d0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
367e0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
367f0 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
36800 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36810 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50  xt;.  char *oldP
36820 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath = pCtx->lock
36830 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e 74  ProxyPath;.  int
36840 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36850 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ..  if( pFile->e
36860 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
36870 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
36880 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
36890 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67    ..  /* nothing
368a0 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61   to do if the pa
368b0 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74  th is NULL, :aut
368c0 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68  o: or matches th
368d0 65 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  e existing path 
368e0 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c  */.  if( !path |
368f0 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20  | path[0]=='\0' 
36900 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c  || !strcmp(path,
36910 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20   ":auto:") ||.  
36920 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73    (oldPath && !s
36930 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20  trncmp(oldPath, 
36940 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  path, MAXPATHLEN
36950 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
36960 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
36970 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  lse{.    unixFil
36980 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70  e *lockProxy = p
36990 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
369a0 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
369b0 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43  oxy=NULL;.    pC
369c0 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
369d0 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  0;.    if( lockP
369e0 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  roxy!=NULL ){.  
369f0 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79      rc=lockProxy
36a00 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
36a10 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
36a20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  *)lockProxy);.  
36a30 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36a40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
36a50 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50  lite3_free(lockP
36a60 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  roxy);.    }.   
36a70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c   sqlite3_free(ol
36a80 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78  dPath);.    pCtx
36a90 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
36aa0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
36ab0 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a  p(0, path);.  }.
36ac0 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
36ad0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69  }../*.** pFile i
36ae0 73 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  s a file that ha
36af0 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79  s been opened by
36b00 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20 63   a prior xOpen c
36b10 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20  all.  dbPath.** 
36b20 69 73 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  is a string buff
36b30 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58 50  er at least MAXP
36b40 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63 74  ATHLEN+1 charact
36b50 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  ers in size..**.
36b60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
36b70 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d  find the filenam
36b80 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
36b90 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69 74  h pFile and writ
36ba0 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50  es it.** int dbP
36bb0 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ath..*/.static i
36bc0 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50 61 74  nt proxyGetDbPat
36bd0 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69  hForUnixFile(uni
36be0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68  xFile *pFile, ch
36bf0 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69 66  ar *dbPath){.#if
36c00 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
36c10 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  __).  if( pFile-
36c20 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70  >pMethod == &afp
36c30 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
36c40 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b 65   /* afp style ke
36c50 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  eps a reference 
36c60 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20 69  to the db path i
36c70 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20 66  n the filePath f
36c80 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20  ield .    ** of 
36c90 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  the struct */.  
36ca0 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73    assert( (int)s
36cb0 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69  trlen((char*)pFi
36cc0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36cd0 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20  xt)<=MAXPATHLEN 
36ce0 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64  );.    strlcpy(d
36cf0 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b  bPath, ((afpLock
36d00 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
36d10 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36d20 78 74 29 2d 3e 64 62 50 61 74 68 2c 20 4d 41 58  xt)->dbPath, MAX
36d30 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c  PATHLEN);.  } el
36d40 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  se.#endif.  if( 
36d50 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
36d60 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
36d70 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f  ods ){.    /* do
36d80 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73 65  t lock style use
36d90 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
36da0 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74  ntext to store t
36db0 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20  he dot lock.    
36dc0 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  ** file path */.
36dd0 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74      int len = st
36de0 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 46 69  rlen((char *)pFi
36df0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36e00 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54  xt) - strlen(DOT
36e10 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20  LOCK_SUFFIX);.  
36e20 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74 68 2c    memcpy(dbPath,
36e30 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
36e40 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20  lockingContext, 
36e50 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73  len + 1);.  }els
36e60 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74  e{.    /* all ot
36e70 68 65 72 20 73 74 79 6c 65 73 20 75 73 65 20 74  her styles use t
36e80 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
36e90 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  xt to store the 
36ea0 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  db file path */.
36eb0 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c      assert( strl
36ec0 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d  en((char*)pFile-
36ed0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
36ee0 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a  <=MAXPATHLEN );.
36ef0 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50 61      strlcpy(dbPa
36f00 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c  th, (char *)pFil
36f10 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
36f20 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  t, MAXPATHLEN);.
36f30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
36f40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
36f50 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65 61 64   Takes an alread
36f60 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69 78  y filled in unix
36f70 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65 72 73   file and alters
36f80 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65 20   it so all file 
36f90 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c  locking .** will
36fa0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   be performed on
36fb0 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78 79   the local proxy
36fc0 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68 65   lock file.  The
36fd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
36fe0 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65 72 76  s.** are preserv
36ff0 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  ed in the lockin
37000 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74 68 61  g context so tha
37010 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 65  t they can be re
37020 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20 74  stored and .** t
37030 68 65 20 75 6e 69 78 20 73 74 72 75 63 74 75 72  he unix structur
37040 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65 61 6e  e properly clean
37050 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65 20 74  ed up at close t
37060 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69  ime:.**  ->locki
37070 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e  ngContext.**  ->
37080 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74 69  pMethod.*/.stati
37090 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73  c int proxyTrans
370a0 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69  formUnixFile(uni
370b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f  xFile *pFile, co
370c0 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20  nst char *path) 
370d0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
370e0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
370f0 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d 41 58   char dbPath[MAX
37100 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20  PATHLEN+1];     
37110 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
37120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
37130 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  /.  char *lockPa
37140 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72  th=NULL;.  int r
37150 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
37160 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65   .  if( pFile->e
37170 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
37180 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
37190 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
371a0 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50 61 74  .  proxyGetDbPat
371b0 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70 46 69  hForUnixFile(pFi
371c0 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 69  le, dbPath);.  i
371d0 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68  f( !path || path
371e0 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74  [0]=='\0' || !st
371f0 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74  rcmp(path, ":aut
37200 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  o:") ){.    lock
37210 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  Path=NULL;.  }el
37220 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68  se{.    lockPath
37230 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b 0a 20  =(char *)path;. 
37240 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28   }.  .  OSTRACE(
37250 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64  ("TRANSPROXY  %d
37260 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
37270 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
37280 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50 61 74          (lockPat
37290 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a 20 22  h ? lockPath : "
372a0 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64  :auto:"), getpid
372b0 28 29 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d 20  ()));..  pCtx = 
372c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
372d0 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b  sizeof(*pCtx) );
372e0 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29  .  if( pCtx==0 )
372f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
37300 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
37310 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20 30 2c   memset(pCtx, 0,
37320 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 29 3b   sizeof(*pCtx));
37330 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72  ..  rc = proxyCr
37340 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d  eateConchPathnam
37350 65 28 64 62 50 61 74 68 2c 20 26 70 43 74 78 2d  e(dbPath, &pCtx-
37360 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b  >conchFilePath);
37370 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
37380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
37390 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
373a0 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  File(pCtx->conch
373b0 46 69 6c 65 50 61 74 68 2c 20 26 70 43 74 78 2d  FilePath, &pCtx-
373c0 3e 63 6f 6e 63 68 46 69 6c 65 2c 20 30 29 3b 0a  >conchFile, 0);.
373d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
373e0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 26 26 20 28  TE_CANTOPEN && (
373f0 28 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  (pFile->openFlag
37400 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 29 20  s&O_RDWR) == 0) 
37410 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 28  ){.      /* if (
37420 61 29 20 74 68 65 20 6f 70 65 6e 20 66 6c 61 67  a) the open flag
37430 73 20 61 72 65 20 6e 6f 74 20 4f 5f 52 44 57 52  s are not O_RDWR
37440 2c 20 28 62 29 20 74 68 65 20 63 6f 6e 63 68 20  , (b) the conch 
37450 69 73 6e 27 74 20 74 68 65 72 65 2c 20 61 6e 64  isn't there, and
37460 0a 20 20 20 20 20 20 2a 2a 20 28 63 29 20 74 68  .      ** (c) th
37470 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 69 73  e file system is
37480 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 6e   read-only, then
37490 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c 6f 63 6b 69   enable no-locki
374a0 6e 67 20 61 63 63 65 73 73 2e 0a 20 20 20 20 20  ng access..     
374b0 20 2a 2a 20 55 67 68 2c 20 73 69 6e 63 65 20 4f   ** Ugh, since O
374c0 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30 30 30 30 20  _RDONLY==0x0000 
374d0 77 65 20 74 65 73 74 20 66 6f 72 20 21 4f 5f 52  we test for !O_R
374e0 44 57 52 20 73 69 6e 63 65 20 75 6e 69 78 4f 70  DWR since unixOp
374f0 65 6e 20 61 73 73 65 72 74 73 0a 20 20 20 20 20  en asserts.     
37500 20 2a 2a 20 74 68 61 74 20 6f 70 65 6e 46 6c 61   ** that openFla
37510 67 73 20 77 69 6c 6c 20 68 61 76 65 20 6f 6e 6c  gs will have onl
37520 79 20 6f 6e 65 20 6f 66 20 4f 5f 52 44 4f 4e 4c  y one of O_RDONL
37530 59 20 6f 72 20 4f 5f 52 44 57 52 2e 0a 20 20 20  Y or O_RDWR..   
37540 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75     */.      stru
37550 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
37560 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  ;.      struct s
37570 74 61 74 20 63 6f 6e 63 68 49 6e 66 6f 3b 0a 20  tat conchInfo;. 
37580 20 20 20 20 20 69 6e 74 20 67 6f 4c 6f 63 6b 6c       int goLockl
37590 65 73 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ess = 0;..      
375a0 69 66 28 20 6f 73 53 74 61 74 28 70 43 74 78 2d  if( osStat(pCtx-
375b0 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20  >conchFilePath, 
375c0 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d 20 2d  &conchInfo) == -
375d0 31 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  1 ) {.        in
375e0 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
375f0 20 20 20 20 20 20 20 69 66 28 20 28 65 72 72 3d         if( (err=
37600 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28 73 74 61  =ENOENT) && (sta
37610 74 66 73 28 64 62 50 61 74 68 2c 20 26 66 73 49  tfs(dbPath, &fsI
37620 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29 7b 0a 20  nfo) != -1) ){. 
37630 20 20 20 20 20 20 20 20 20 67 6f 4c 6f 63 6b 6c           goLockl
37640 65 73 73 20 3d 20 28 66 73 49 6e 66 6f 2e 66 5f  ess = (fsInfo.f_
37650 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f 4e 4c 59  flags&MNT_RDONLY
37660 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e 4c 59 3b  ) == MNT_RDONLY;
37670 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37680 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 6f 4c   }.      if( goL
37690 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20 20 20 20  ockless ){.     
376a0 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65     pCtx->conchHe
376b0 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72 65 61 64  ld = -1; /* read
376c0 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63 6b 6c 65   only FS/ lockle
376d0 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ss */.        rc
376e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
376f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
37700 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
37710 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50 61 74  TE_OK && lockPat
37720 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 6c  h ){.    pCtx->l
37730 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
37740 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
37750 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 7d  , lockPath);.  }
37760 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
37770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 74  TE_OK ){.    pCt
37780 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71 6c 69  x->dbPath = sqli
37790 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 64  te3DbStrDup(0, d
377a0 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  bPath);.    if( 
377b0 70 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d 4e 55  pCtx->dbPath==NU
377c0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  LL ){.      rc =
377d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
377e0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
377f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
37800 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72      /* all memor
37810 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20  y is allocated, 
37820 70 72 6f 78 79 73 20 61 72 65 20 63 72 65 61 74  proxys are creat
37830 65 64 20 61 6e 64 20 61 73 73 69 67 6e 65 64 2c  ed and assigned,
37840 20 0a 20 20 20 20 2a 2a 20 73 77 69 74 63 68 20   .    ** switch 
37850 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
37860 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20  ext and pMethod 
37870 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20 20 20  then return..   
37880 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e 6f 6c   */.    pCtx->ol
37890 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  dLockingContext 
378a0 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  = pFile->locking
378b0 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69  Context;.    pFi
378c0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
378d0 78 74 20 3d 20 70 43 74 78 3b 0a 20 20 20 20 70  xt = pCtx;.    p
378e0 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 20  Ctx->pOldMethod 
378f0 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  = pFile->pMethod
37900 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ;.    pFile->pMe
37910 74 68 6f 64 20 3d 20 26 70 72 6f 78 79 49 6f 4d  thod = &proxyIoM
37920 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
37930 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63  .    if( pCtx->c
37940 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20 20 20  onchFile ){ .   
37950 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69     pCtx->conchFi
37960 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  le->pMethod->xCl
37970 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
37980 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e *)pCtx->conchF
37990 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ile);.      sqli
379a0 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63  te3_free(pCtx->c
379b0 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d  onchFile);.    }
379c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
379d0 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b  ee(0, pCtx->lock
379e0 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  ProxyPath);.    
379f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
37a00 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
37a10 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ); .    sqlite3_
37a20 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a  free(pCtx);.  }.
37a30 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e    OSTRACE(("TRAN
37a40 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22  SPROXY  %d %s\n"
37a50 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
37a60 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49         (rc==SQLI
37a70 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
37a80 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72 65  failed")));.  re
37a90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
37aa0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
37ab0 68 61 6e 64 6c 65 73 20 73 71 6c 69 74 65 33 5f  handles sqlite3_
37ac0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63  file_control() c
37ad0 61 6c 6c 73 20 74 68 61 74 20 61 72 65 20 73 70  alls that are sp
37ae0 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f  ecific.** to pro
37af0 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  xy locking..*/.s
37b00 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46  tatic int proxyF
37b10 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
37b20 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
37b30 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
37b40 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  {.  switch( op )
37b50 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
37b60 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
37b70 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69  ILE: {.      uni
37b80 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
37b90 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
37ba0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
37bb0 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79  Method == &proxy
37bc0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
37bd0 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e       proxyLockin
37be0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
37bf0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
37c00 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f  ntext*)pFile->lo
37c10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
37c20 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b 65 43        proxyTakeC
37c30 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20  onch(pFile);.   
37c40 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c       if( pCtx->l
37c50 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
37c60 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73            *(cons
37c70 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d  t char **)pArg =
37c80 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
37c90 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 65  Path;.        }e
37ca0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
37cb0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70  (const char **)p
37cc0 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e  Arg = ":auto: (n
37cd0 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20 20  ot held)";.     
37ce0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73     }.      } els
37cf0 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 6f  e {.        *(co
37d00 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67  nst char **)pArg
37d10 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d   = NULL;.      }
37d20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
37d30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
37d40 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
37d50 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
37d60 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  : {.      unixFi
37d70 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
37d80 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20  xFile*)id;.     
37d90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
37da0 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  _OK;.      int i
37db0 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 28 70  sProxyStyle = (p
37dc0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  File->pMethod ==
37dd0 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73   &proxyIoMethods
37de0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  );.      if( pAr
37df0 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73  g==NULL || (cons
37e00 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d 3d 30  t char *)pArg==0
37e10 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
37e20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a  isProxyStyle ){.
37e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72            /* tur
37e40 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b  n off proxy lock
37e50 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72  ing - not suppor
37e60 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ted */.         
37e70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
37e80 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54  OR /*SQLITE_PROT
37e90 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53  OCOL? SQLITE_MIS
37ea0 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20  USE?*/;.        
37eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
37ec0 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f   /* turn off pro
37ed0 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72  xy locking - alr
37ee0 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20  eady off - NOOP 
37ef0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
37f00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
37f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
37f20 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  se{.        cons
37f30 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61 74  t char *proxyPat
37f40 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  h = (const char 
37f50 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20  *)pArg;.        
37f60 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65  if( isProxyStyle
37f70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72   ){.          pr
37f80 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
37f90 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20 20 20  t *pCtx = .     
37fa0 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c 6f 63         (proxyLoc
37fb0 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
37fc0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
37fd0 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  xt;.          if
37fe0 28 20 21 73 74 72 63 6d 70 28 70 41 72 67 2c 20  ( !strcmp(pArg, 
37ff0 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20 20 20  ":auto:") .     
38000 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e        || (pCtx->
38010 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 26 26  lockProxyPath &&
38020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
38030 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c  !strncmp(pCtx->l
38040 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 70 72  ockProxyPath, pr
38050 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48  oxyPath, MAXPATH
38060 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20 20 20  LEN)).          
38070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
38080 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
38090 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
380a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
380b0 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79   switchLockProxy
380c0 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72 6f 78  Path(pFile, prox
380d0 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  yPath);.        
380e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
380f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
38100 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69  turn on proxy fi
38110 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  le locking */.  
38120 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
38130 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
38140 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f 78 79  ile(pFile, proxy
38150 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 7d  Path);.        }
38160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
38170 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
38180 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
38190 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
381a0 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61  ;  /* The call a
381b0 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e 6c 79  ssures that only
381c0 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73 20 61   valid opcodes a
381d0 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d  re sent */.    }
381e0 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
381f0 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53  HED*/.  return S
38200 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
38210 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69  /*.** Within thi
38220 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68 65 20  s division (the 
38230 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67  proxying locking
38240 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
38250 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 73 0a   the procedures.
38260 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 70 6f  ** above this po
38270 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74 69 6c  int are all util
38280 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b  ities.  The lock
38290 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f 64 73  -related methods
382a0 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79   of the.** proxy
382b0 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33  -locking sqlite3
382c0 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63  _io_method objec
382d0 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f  t follow..*/.../
382e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
382f0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
38300 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
38310 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
38320 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
38330 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
38340 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
38350 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
38360 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
38370 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
38380 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
38390 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
383a0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
383b0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
383c0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
383d0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
383e0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
383f0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
38400 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
38410 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65  tic int proxyChe
38420 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
38430 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
38440 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
38450 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
38460 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
38470 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  id;.  int rc = p
38480 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46  roxyTakeConch(pF
38490 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ile);.  if( rc==
384a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
384b0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
384c0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
384d0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
384e0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
384f0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69  ngContext;.    i
38500 66 28 20 70 43 74 78 2d 3e 63 6f 6e