/ Hex Artifact Content
Login

Artifact cb94e52f705b8e0ae2b2ddd387f71d6c4e08cd71:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  .h>.# if OS_VXWO
11b0: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
11c0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
11e0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
11f0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
1200: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1210: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
1220: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1230: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1240: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1260: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
1270: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1280: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
1290: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
12a0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
12b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  if../*.** Allowe
12c0: 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78  d values of unix
12d0: 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a  File.fsFlags.*/.
12e0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46  #define SQLITE_F
12f0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20  SFLAGS_IS_MSDOS 
1300: 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49      0x1../*.** I
1310: 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74  f we are to be t
1320: 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c  hread-safe, incl
1330: 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73  ude the pthreads
1340: 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69   header and defi
1350: 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ne.** the SQLITE
1360: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61  _UNIX_THREADS ma
1370: 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  cro..*/.#if SQLI
1380: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20  TE_THREADSAFE.# 
1390: 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64  include <pthread
13a0: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .h>.# define SQL
13b0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
13c0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
13d0: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
13e0: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
13f0: 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f  ng a new file.*/
1400: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1410: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
1420: 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e  MISSIONS.# defin
1430: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
1440: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1450: 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f  S 0644.#endif../
1460: 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  *. ** Default pe
1470: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1480: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1490: 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64  xy dir. */.#ifnd
14a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
14b0: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
14c0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
14d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
14e0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
14f0: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
1500: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
1510: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
1520: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
1530: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
1540: 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  2../*.** Only se
1550: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
1560: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
1570: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
1580: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
1590: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
15a0: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
15b0: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
15c0: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
15d0: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
15e0: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
15f0: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
1600: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
1610: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1620: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
1630: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
1640: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
1650: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1660: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
1670: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
1680: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1690: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
16a0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
16b0: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
16c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
16d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
16e0: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
16f0: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
1700: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
1710: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
1720: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
1730: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
1740: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
1750: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
1760: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
1770: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
1780: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
1790: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
17a0: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
17b0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
17c0: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
17d0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
17e0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
17f0: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
1800: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
1810: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
1820: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
1830: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
1840: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1850: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
1860: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
1870: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
18a0: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
18b0: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
18c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
18d0: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
18e0: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
18f0: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
1900: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
1910: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
1920: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1930: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
1940: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
1950: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1960: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1970: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1980: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1990: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
19a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
19b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
19c0: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
19d0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
19e0: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
19f0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
1a00: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
1a10: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
1a20: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69  t entry */.  uni
1a30: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1a40: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
1a50: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c   /* Info about l
1a60: 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f  ocks on this ino
1a70: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  de */.  int h;  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1aa0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1ab0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  or */.  int dirf
1ac0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ae0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
1af0: 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  or the directory
1b00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1b10: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b30: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b40: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b50: 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f  .  int lastErrno
1b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
1b80: 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61  ix errno from la
1b90: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
1ba0: 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43    void *lockingC
1bb0: 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20  ontext;         
1bc0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1bd0: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
1be0: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
1bf0: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
1c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c10: 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20  * Pre-allocated 
1c20: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a  UnixUnusedFd */.
1c30: 20 20 69 6e 74 20 66 69 6c 65 46 6c 61 67 73 3b    int fileFlags;
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c 6c        /* Miscell
1c60: 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 20  anous flags */. 
1c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c80: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1c90: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ca0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cb0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1ce0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1cf0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d00: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d30: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d40: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d50: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d60: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d70: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d90: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1da0: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1db0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1dc0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dd0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1de0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1df0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e20: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e30: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e40: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e50: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e80: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1e90: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1ea0: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1eb0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1ec0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ed0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ee0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1ef0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1f00: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f10: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f20: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f30: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f40: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f60: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f70: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f80: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1f90: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1fa0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fb0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fc0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fd0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1fe0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1ff0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2000: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2010: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2020: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2030: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2040: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2050: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2060: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2070: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2080: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2090: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
20a0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20b0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20c0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20d0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20e0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
20f0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2100: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2110: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2120: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2130: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2140: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2150: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2160: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2170: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2180: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2190: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
21a0: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21b0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21c0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21d0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21e0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
21f0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
2200: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2210: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2220: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
2230: 61 63 72 6f 73 20 64 65 66 69 6e 65 20 62 69 74  acros define bit
2240: 73 20 69 6e 20 75 6e 69 78 46 69 6c 65 2e 66 69  s in unixFile.fi
2250: 6c 65 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  leFlags.*/.#defi
2260: 6e 65 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f  ne SQLITE_WHOLE_
2270: 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 20 30 78  FILE_LOCKING  0x
2280: 30 30 30 31 20 20 20 2f 2a 20 55 73 65 20 77 68  0001   /* Use wh
2290: 6f 6c 65 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ole-file locking
22a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
22b0: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
22c0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
22d0: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
22e0: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
22f0: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  n.h"../*.** Defi
2300: 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f  ne various macro
2310: 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69  s that are missi
2320: 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73  ng from some sys
2330: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
2340: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
2350: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
2360: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  E 0.#endif.#ifde
2370: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2380: 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c  _LFS.# undef O_L
2390: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
23a0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
23b0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
23c0: 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69  _NOFOLLOW.# defi
23d0: 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a  ne O_NOFOLLOW 0.
23e0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
23f0: 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65  _BINARY.# define
2400: 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64   O_BINARY 0.#end
2410: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68  if../*.** The th
2420: 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73  readid macro res
2430: 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72  olves to the thr
2440: 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20  ead-id or to 0. 
2450: 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   Used for.** tes
2460: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
2470: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20  ng only..*/.#if 
2480: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2490: 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  E.#define thread
24a0: 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28  id pthread_self(
24b0: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
24c0: 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69  threadid 0.#endi
24d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79  f../*.** Many sy
24e0: 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61  stem calls are a
24f0: 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20  ccessed through 
2500: 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74  pointer-to-funct
2510: 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20  ions so that.** 
2520: 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72  they may be over
2530: 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d  ridden at runtim
2540: 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  e to facilitate 
2550: 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20  fault injection 
2560: 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e  during.** testin
2570: 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67  g and sandboxing
2580: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
2590: 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65   array holds the
25a0: 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74   names and point
25b0: 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76  ers.** to all ov
25c0: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
25d0: 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  m calls..*/.stat
25e0: 69 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73  ic struct unix_s
25f0: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
2600: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
2610: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2620: 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a  e sytem call */.
2630: 20 20 76 6f 69 64 20 2a 70 43 75 72 72 65 6e 74    void *pCurrent
2640: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
2650: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
2660: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
2670: 0a 20 20 76 6f 69 64 20 2a 70 44 65 66 61 75 6c  .  void *pDefaul
2680: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  t;         /* De
2690: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
26a0: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
26b0: 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20    { "open",     
26c0: 20 20 20 20 28 76 6f 69 64 2a 29 6f 70 65 6e 2c      (void*)open,
26d0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
26e0: 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20  fine osOpen     
26f0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2700: 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61  char*,int,int))a
2710: 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72  Syscall[0].pCurr
2720: 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65  ent)..  { "close
2730: 22 2c 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a  ",        (void*
2740: 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20  )close,      0  
2750: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f  },.#define osClo
2760: 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  se     ((int(*)(
2770: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d  int))aSyscall[1]
2780: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2790: 22 61 63 63 65 73 73 22 2c 20 20 20 20 20 20 20  "access",       
27a0: 28 76 6f 69 64 2a 29 61 63 63 65 73 73 2c 20 20  (void*)access,  
27b0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
27c0: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
27d0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
27e0: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
27f0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
2800: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
2810: 20 20 28 76 6f 69 64 2a 29 67 65 74 63 77 64 2c    (void*)getcwd,
2820: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2830: 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28  ne osGetcwd    (
2840: 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c  (char*(*)(char*,
2850: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
2860: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [3].pCurrent).. 
2870: 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20   { "stat",      
2880: 20 20 20 28 76 6f 69 64 2a 29 73 74 61 74 2c 20     (void*)stat, 
2890: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
28a0: 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20 20  ine osStat      
28b0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
28c0: 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74  har*,struct stat
28d0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70  *))aSyscall[4].p
28e0: 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20  Current)../*.** 
28f0: 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c  The DJGPP compil
2900: 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c  er environment l
2910: 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65  ooks mostly like
2920: 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a   Unix, but it.**
2930: 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c   lacks the fcntl
2940: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  () system call. 
2950: 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e   So redefine fcn
2960: 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74  tl() to be somet
2970: 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77  hing.** that alw
2980: 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54  ays succeeds.  T
2990: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c  his means that l
29a0: 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20  ocking does not 
29b0: 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44  occur under.** D
29c0: 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73  JGPP.  But it is
29d0: 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20   DOS - what did 
29e0: 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23  you expect?.*/.#
29f0: 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  ifdef __DJGPP__.
2a00: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
2a10: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2a20: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
2a30: 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62  fine osFstat(a,b
2a40: 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20  ,c)    0.#else  
2a50: 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c     .  { "fstat",
2a60: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 66          (void*)f
2a70: 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c  stat,      0  },
2a80: 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74  .#define osFstat
2a90: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
2aa0: 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  t,struct stat*))
2ab0: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
2ac0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20  rent).#endif..  
2ad0: 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20  { "ftruncate",  
2ae0: 20 20 28 76 6f 69 64 2a 29 66 74 72 75 6e 63 61    (void*)ftrunca
2af0: 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69  te,  0  },.#defi
2b00: 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28  ne osFtruncate (
2b10: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f  (int(*)(int,off_
2b20: 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70  t))aSyscall[6].p
2b30: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
2b40: 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28 76  cntl",        (v
2b50: 6f 69 64 2a 29 66 63 6e 74 6c 2c 20 20 20 20 20  oid*)fcntl,     
2b60: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2b70: 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74  sFcntl     ((int
2b80: 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29  (*)(int,int,...)
2b90: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
2ba0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61  rrent)..  { "rea
2bb0: 64 22 2c 20 20 20 20 20 20 20 20 20 28 76 6f 69  d",         (voi
2bc0: 64 2a 29 72 65 61 64 2c 20 20 20 20 20 20 20 30  d*)read,       0
2bd0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52    },.#define osR
2be0: 65 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65  ead      ((ssize
2bf0: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
2c00: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
2c10: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
2c20: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
2c30: 52 45 41 44 29 20 7c 7c 20 64 65 66 69 6e 65 64  READ) || defined
2c40: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
2c50: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20 20  OCKING_STYLE).  
2c60: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
2c70: 20 20 28 76 6f 69 64 2a 29 70 72 65 61 64 2c 20    (void*)pread, 
2c80: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
2c90: 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20  .  { "pread",   
2ca0: 20 20 20 20 20 28 76 6f 69 64 2a 29 30 2c 20 20       (void*)0,  
2cb0: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
2cc0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
2cd0: 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a 65  read     ((ssize
2ce0: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
2cf0: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
2d00: 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65  yscall[9].pCurre
2d10: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2d20: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
2d30: 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20  { "pread64",    
2d40: 20 20 28 76 6f 69 64 2a 29 70 72 65 61 64 36 34    (void*)pread64
2d50: 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  ,    0  },.#else
2d60: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
2d70: 20 20 20 20 20 28 76 6f 69 64 2a 29 30 2c 20 20       (void*)0,  
2d80: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
2d90: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
2da0: 72 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65  read64   ((ssize
2db0: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
2dc0: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
2dd0: 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72  yscall[10].pCurr
2de0: 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65  ent)..  { "write
2df0: 22 2c 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a  ",        (void*
2e00: 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20 20  )write,      0  
2e10: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  },.#define osWri
2e20: 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  te     ((ssize_t
2e30: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
2e40: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
2e50: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
2e60: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
2e70: 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 64 65  USE_PREAD) || de
2e80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2e90: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2ea0: 45 29 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c  E).  { "pwrite",
2eb0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 77         (void*)pw
2ec0: 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a  rite,     0  },.
2ed0: 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74  #else.  { "pwrit
2ee0: 65 22 2c 20 20 20 20 20 20 20 28 76 6f 69 64 2a  e",       (void*
2ef0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
2f00: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
2f10: 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28  e osPwrite    ((
2f20: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
2f30: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
2f40: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2f60: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
2f70: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
2f80: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
2f90: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
2fa0: 20 20 20 20 28 76 6f 69 64 2a 29 70 77 72 69 74      (void*)pwrit
2fb0: 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c  e64,   0  },.#el
2fc0: 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34  se.  { "pwrite64
2fd0: 22 2c 20 20 20 20 20 28 76 6f 69 64 2a 29 30 2c  ",     (void*)0,
2fe0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
2ff0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3000: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
3010: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3020: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3030: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
3040: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
3050: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
3060: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22  t)..  { "fchmod"
3070: 2c 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 66  ,       (void*)f
3080: 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c  chmod,     0  },
3090: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f  .#define osFchmo
30a0: 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  d    ((int(*)(in
30b0: 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  t,mode_t))aSysca
30c0: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
30d0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
30e0: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
30f0: 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
3100: 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20  X_FALLOCATE.  { 
3110: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
3120: 28 76 6f 69 64 2a 29 70 6f 73 69 78 5f 66 61 6c  (void*)posix_fal
3130: 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65  locate,  0 },.#e
3140: 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61  lse.  { "falloca
3150: 74 65 22 2c 20 20 20 20 28 76 6f 69 64 2a 29 30  te",    (void*)0
3160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3170: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
3180: 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74 65  fine osFallocate
3190: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66   ((int(*)(int,of
31a0: 66 5f 74 2c 6f 66 66 5f 74 29 61 53 79 73 63 61  f_t,off_t)aSysca
31b0: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
31c0: 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ..}; /* End of t
31d0: 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  he overrideable 
31e0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a  system calls */.
31f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
3200: 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  he xSetSystemCal
3210: 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71  l() method of sq
3220: 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c  lite3_vfs for al
3230: 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69  l of the.** "uni
3240: 78 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72  x" VFSes.  Retur
3250: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e  n SQLITE_OK opon
3260: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70   successfully up
3270: 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79  dating the.** sy
3280: 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65  stem call pointe
3290: 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54  r, or SQLITE_NOT
32a0: 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69  FOUND if there i
32b0: 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c  s no configurabl
32c0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
32d0: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f   named zName..*/
32e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
32f0: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  SetSystemCall(. 
3300: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
3310: 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 54  otUsed,     /* T
3320: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
3330: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
3340: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3350: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ,         /* Nam
3360: 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c  e of system call
3370: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a   to override */.
3380: 20 20 76 6f 69 64 20 2a 70 4e 65 77 46 75 6e 63    void *pNewFunc
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33a0: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
33b0: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
33c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
33d0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33e0: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 69 66  E_NOTFOUND;.  if
33f0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
3400: 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65    /* If no zName
3410: 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f   is given, resto
3420: 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61  re all system ca
3430: 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  lls to their def
3440: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74  ault.    ** sett
3450: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ings and return 
3460: 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20  NULL.    */.    
3470: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
3480: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
3490: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
34a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
34b0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
34c0: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
34d0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
34e0: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
34f0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
3500: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3510: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
3520: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
3530: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
3540: 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61  specified, opera
3550: 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f  te on only the o
3560: 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20  ne system call. 
3570: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e     ** specified.
3580: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
3590: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
35a0: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
35b0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
35c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
35d0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
35e0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
35f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
3600: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
3610: 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ault==0 ){.     
3620: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
3630: 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73  .pDefault = aSys
3640: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
3650: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3660: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3670: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
3680: 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e  pNewFunc==0 ) pN
3690: 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c  ewFunc = aSyscal
36a0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
36b0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
36c0: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e  i].pCurrent = pN
36d0: 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  ewFunc;.        
36e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
36f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3700: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
3710: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
3720: 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  of a system call
3730: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
3740: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61  f zName is not a
3750: 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73  .** recognized s
3760: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e  ystem call name.
3770: 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72    NULL is also r
3780: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73  eturned if the s
3790: 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73  ystem call.** is
37a0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66   currently undef
37b0: 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
37c0: 76 6f 69 64 20 2a 75 6e 69 78 47 65 74 53 79 73  void *unixGetSys
37d0: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
37e0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 63  vfs *pNotUsed, c
37f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3800: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
3810: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
3820: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
3830: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
3840: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
3850: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
3860: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
3870: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
3880: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
3890: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
38a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
38b0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
38c0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
38d0: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
38e0: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
38f0: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
3900: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
3910: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
3920: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
3930: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
3940: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
3950: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
3960: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
3970: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
3980: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
3990: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
39a0: 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  nixNextSystemCal
39b0: 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  l(sqlite3_vfs *p
39c0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
39d0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
39e0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
39f0: 0a 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 7d  .    i = -1;.  }
3a00: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
3a10: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
3a20: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
3a30: 73 63 61 6c 6c 5b 30 5d 29 2d 31 3b 20 69 2b 2b  scall[0])-1; i++
3a40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
3a50: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
3a60: 61 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[0].zName)==0
3a70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
3a80: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
3a90: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
3aa0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
3ab0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
3ac0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 30 5d   if( aSyscall[0]
3ad0: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
3ae0: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 30  eturn aSyscall[0
3af0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
3b00: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
3b10: 2a 20 52 65 74 72 79 20 6f 70 65 6e 28 29 20 63  * Retry open() c
3b20: 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64  alls that fail d
3b30: 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73  ue to EINTR.*/.s
3b40: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
3b50: 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
3b60: 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 69 6e 74 20   *z, int f, int 
3b70: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
3b80: 64 6f 7b 20 72 63 20 3d 20 6f 73 4f 70 65 6e 28  do{ rc = osOpen(
3b90: 7a 2c 66 2c 6d 29 3b 20 7d 77 68 69 6c 65 28 20  z,f,m); }while( 
3ba0: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
3bb0: 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  INTR );.  return
3bc0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65   rc;.}../*.** He
3bd0: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  lper functions t
3be0: 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c  o obtain and rel
3bf0: 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62  inquish the glob
3c00: 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a  al mutex. The.**
3c10: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73   global mutex is
3c20: 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74   used to protect
3c30: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
3c40: 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b  fo and.** vxwork
3c50: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 73 20  sFileId objects 
3c60: 75 73 65 64 20 62 79 20 74 68 69 73 20 66 69 6c  used by this fil
3c70: 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20  e, all of which 
3c80: 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61 72 65  may be .** share
3c90: 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
3ca0: 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
3cb0: 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48  ction unixMutexH
3cc0: 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f  eld() is used to
3cd0: 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
3ce0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
3cf0: 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
3d00: 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
3d10: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
3d20: 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
3d30: 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
3d40: 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
3d50: 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  *.**   unixEnter
3d60: 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61  Mutex().**     a
3d70: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
3d80: 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75  Held() );.**   u
3d90: 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28 29 0a  nixEnterLeave().
3da0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
3db0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f  nixEnterMutex(vo
3dc0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
3dd0: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
3de0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
3df0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
3e00: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61  _MASTER));.}.sta
3e10: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61  tic void unixLea
3e20: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
3e30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
3e40: 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
3e50: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
3e60: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
3e70: 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  R));.}.#ifdef SQ
3e80: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
3e90: 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48  c int unixMutexH
3ea0: 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
3eb0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3ec0: 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
3ed0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
3ee0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
3ef0: 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
3f00: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
3f10: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c  _DEBUG./*.** Hel
3f20: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  per function for
3f30: 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72   printing out tr
3f40: 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ace information 
3f50: 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a  from debugging.*
3f60: 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73  * binaries. This
3f70: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72   returns the str
3f80: 69 6e 67 20 72 65 70 72 65 73 65 74 61 74 69 6f  ing represetatio
3f90: 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  n of the supplie
3fa0: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63  d.** integer loc
3fb0: 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69  k-type..*/.stati
3fc0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
3fd0: 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69  FileLock(int eFi
3fe0: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63  leLock){.  switc
3ff0: 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  h( eFileLock ){.
4000: 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b      case NO_LOCK
4010: 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b  : return "NONE";
4020: 0a 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44  .    case SHARED
4030: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53  _LOCK: return "S
4040: 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65  HARED";.    case
4050: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20   RESERVED_LOCK: 
4060: 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44  return "RESERVED
4070: 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44  ";.    case PEND
4080: 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  ING_LOCK: return
4090: 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20   "PENDING";.    
40a0: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
40b0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43  OCK: return "EXC
40c0: 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72  LUSIVE";.  }.  r
40d0: 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d  eturn "ERROR";.}
40e0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
40f0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
4100: 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75  E./*.** Print ou
4110: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
4120: 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20  out all locking 
4130: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
4140: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4150: 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62  s used for troub
4160: 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73  leshooting locks
4170: 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65   on multithreade
4180: 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20  d.** platforms. 
4190: 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69   Enable by compi
41a0: 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44  ling with the -D
41b0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
41c0: 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  E.** command-lin
41d0: 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20  e option on the 
41e0: 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20  compiler.  This 
41f0: 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  code is normally
4200: 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a  .** turned off..
4210: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
4220: 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20  ckTrace(int fd, 
4230: 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66  int op, struct f
4240: 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72  lock *p){.  char
4250: 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70   *zOpName, *zTyp
4260: 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e  e;.  int s;.  in
4270: 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  t savedErrno;.  
4280: 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20  if( op==F_GETLK 
4290: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
42a0: 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "GETLK";.  }els
42b0: 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c  e if( op==F_SETL
42c0: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
42d0: 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "SETLK";.  }e
42e0: 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46  lse{.    s = osF
42f0: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
4300: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4310: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
4320: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
4330: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
4340: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
4350: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
4360: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
4370: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
4380: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
4390: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
43a0: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
43b0: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
43c0: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
43d0: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
43e0: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
43f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
4400: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
4410: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
4420: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
4430: 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28  ;.  s = osFcntl(
4440: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61  fd, op, p);.  sa
4450: 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  vedErrno = errno
4460: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
4470: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64  Printf("fcntl %d
4480: 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20   %d %s %s %d %d 
4490: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74  %d %d\n",.     t
44a0: 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70  hreadid, fd, zOp
44b0: 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e  Name, zType, (in
44c0: 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69  t)p->l_start, (i
44d0: 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20  nt)p->l_len,.   
44e0: 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c    (int)p->l_pid,
44f0: 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d   s);.  if( s==(-
4500: 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c  1) && op==F_SETL
4510: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
4520: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
4530: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
4540: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
4550: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
4560: 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c   *p;.    osFcntl
4570: 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  (fd, F_GETLK, &l
4580: 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c  2);.    if( l2.l
4590: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
45a0: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
45b0: 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "RDLCK";.    }el
45c0: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
45d0: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
45e0: 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43     zType = "WRLC
45f0: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
4600: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( l2.l_type==F_U
4610: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  NLCK ){.      zT
4620: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
4630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4640: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20  assert( 0 );.   
4650: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
4660: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
4670: 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a  -failure-reason:
4680: 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %s %d %d %d\n",
4690: 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28  .       zType, (
46a0: 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20  int)l2.l_start, 
46b0: 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28  (int)l2.l_len, (
46c0: 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20  int)l2.l_pid);. 
46d0: 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76   }.  errno = sav
46e0: 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72  edErrno;.  retur
46f0: 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73  n s;.}.#undef os
4700: 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73  Fcntl.#define os
4710: 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a  Fcntl lockTrace.
4720: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4730: 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a  _LOCK_TRACE */..
4740: 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75  /*.** Retry ftru
4750: 6e 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68  ncate() calls th
4760: 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45  at fail due to E
4770: 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69  INTR.*/.static i
4780: 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  nt robust_ftrunc
4790: 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74  ate(int h, sqlit
47a0: 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20  e3_int64 sz){.  
47b0: 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63  int rc;.  do{ rc
47c0: 20 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68   = osFtruncate(h
47d0: 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  ,sz); }while( rc
47e0: 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
47f0: 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  TR );.  return r
4800: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
4810: 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61   routine transla
4820: 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50  tes a standard P
4830: 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20  OSIX errno code 
4840: 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  into something.*
4850: 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20  * useful to the 
4860: 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73  clients of the s
4870: 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73  qlite3 functions
4880: 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .  Specifically,
4890: 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64   it is.** intend
48a0: 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20  ed to translate 
48b0: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72  a variety of "tr
48c0: 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20  y again" errors 
48d0: 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59  into SQLITE_BUSY
48e0: 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74  .** and a variet
48f0: 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f  y of "please clo
4900: 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
4910: 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f  riptor NOW" erro
4920: 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49  rs into .** SQLI
4930: 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20  TE_IOERR.** .** 
4940: 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e  Errors during in
4950: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
4960: 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73  locks, or file s
4970: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f  ystem support fo
4980: 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75  r locks,.** shou
4990: 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b  ld handle ENOLCK
49a0: 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f  , ENOTSUP, EOPNO
49b0: 54 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79  TSUPP separately
49c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
49d0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
49e0: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f  osixError(int po
49f0: 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71  sixError, int sq
4a00: 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73  liteIOErr) {.  s
4a10: 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f  witch (posixErro
4a20: 72 29 20 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a  r) {.  case 0: .
4a30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4a40: 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73  E_OK;.    .  cas
4a50: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
4a60: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
4a70: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
4a80: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
4a90: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
4aa0: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
4ab0: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
4ac0: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
4ad0: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
4ae0: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
4af0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
4b00: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
4b10: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
4b20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
4b30: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
4b40: 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20  EACCES: .    /* 
4b50: 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45  EACCES is like E
4b60: 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63  AGAIN during loc
4b70: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c  king operations,
4b80: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68   but not any oth
4b90: 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66  er time*/.    if
4ba0: 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ( (sqliteIOErr =
4bb0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
4bc0: 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74  OCK) || ..(sqlit
4bd0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
4be0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c  _IOERR_UNLOCK) |
4bf0: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
4c00: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
4c10: 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71  _RDLOCK) ||..(sq
4c20: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
4c30: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
4c40: 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a  ESERVEDLOCK) ){.
4c50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
4c60: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
4c70: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c      /* else fall
4c80: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61   through */.  ca
4c90: 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72  se EPERM: .    r
4ca0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
4cb0: 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  M;.    .  case E
4cc0: 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75  DEADLK:.    retu
4cd0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
4ce0: 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69  BLOCKED;.    .#i
4cf0: 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e  f EOPNOTSUPP!=EN
4d00: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50  OTSUP.  case EOP
4d10: 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a  NOTSUPP: .    /*
4d20: 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20   something went 
4d30: 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75  terribly awry, u
4d40: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
4d50: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
4d60: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
4d70: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
4d80: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
4d90: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
4da0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
4db0: 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20   ENOTSUP.  case 
4dc0: 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a  ENOTSUP: .    /*
4dd0: 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c   invalid fd, unl
4de0: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
4df0: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69  system support i
4e00: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
4e10: 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69   which .     * i
4e20: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
4e30: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
4e40: 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45  .#endif.  case E
4e50: 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46  IO:.  case EBADF
4e60: 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a  :.  case EINVAL:
4e70: 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e  .  case ENOTCONN
4e80: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a  :.  case ENODEV:
4e90: 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20  .  case ENXIO:. 
4ea0: 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20   case ENOENT:.  
4eb0: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 20 20 63  case ESTALE:.  c
4ec0: 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20  ase ENOSYS:.    
4ed0: 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20  /* these should 
4ee0: 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74  force the client
4ef0: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69   to close the fi
4f00: 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74  le and reconnect
4f10: 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75   */.    .  defau
4f20: 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  lt: .    return 
4f30: 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d  sqliteIOErr;.  }
4f40: 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}..../*********
4f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f90: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
4fa0: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55  ******** Begin U
4fb0: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
4fc0: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
4fd0: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
4fe0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d  *****.**.** On m
4ff0: 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ost versions of 
5000: 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74  unix, we can get
5010: 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72   a unique ID for
5020: 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61   a file by conca
5030: 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  tenating.** the 
5040: 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e  device number an
5050: 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  d the inode numb
5060: 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f  er.  But this do
5070: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
5080: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78  xWorks..** On Vx
5090: 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20  Works, a unique 
50a0: 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20  file id must be 
50b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e  based on the can
50c0: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
50d0: 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
50e0: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
50f0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
5100: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
5110: 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75  e used as a.** u
5120: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e  nique file ID in
5130: 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20   VxWorks.  Each 
5140: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
5150: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
5160: 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66  ins.** a copy of
5170: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
5180: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20  ilename.  There 
5190: 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65  is also a refere
51a0: 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20  nce count.  .** 
51b0: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  The structure is
51c0: 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20   reclaimed when 
51d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
51e0: 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f  inters to it dro
51f0: 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  ps to.** zero..*
5200: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
5210: 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66  ever very many f
5220: 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65  iles open at one
5230: 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70   time and lookup
5240: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70  s are not.** a p
5250: 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69  erformance-criti
5260: 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20  cal path, so it 
5270: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
5280: 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74   put these.** st
5290: 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69  ructures on a li
52a0: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  nked list..*/.st
52b0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
52c0: 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78  Id {.  struct vx
52d0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
52e0: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
52f0: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
5300: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ll */.  int nRef
5310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5320: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5330: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
5340: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69   this one */.  i
5350: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5370: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43  Length of the zC
5380: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73  anonicalName[] s
5390: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
53a0: 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b  *zCanonicalName;
53b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f           /* Cano
53c0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a  nical filename *
53d0: 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  /.};..#if OS_VXW
53e0: 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20  ORKS./* .** All 
53f0: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73  unique filenames
5400: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c   are held on a l
5410: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65  inked list heade
5420: 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72  d by this.** var
5430: 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  iable:.*/.static
5440: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
5450: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
5460: 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
5470: 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69  ** Simplify a fi
5480: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20  lename into its 
5490: 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a  canonical form.*
54a0: 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  * by making the 
54b0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
54c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f  s:.**.**  * remo
54d0: 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ving any trailin
54e0: 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  g and duplicate 
54f0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
5500: 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  /./ into just /.
5510: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41  **  * convert /A
5520: 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20  /../ where A is 
5530: 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20  any simple name 
5540: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a  into just /.**.*
5550: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61  * Changes are ma
5560: 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65  de in-place.  Re
5570: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d  turn the new nam
5580: 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20  e length..**.** 
5590: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  The original fil
55a0: 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e  ename is in z[0.
55b0: 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74  .n-1].  Return t
55c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
55d0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
55e0: 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d  e simplified nam
55f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5600: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
5610: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  Name(char *z, in
5620: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  t n){.  int i, j
5630: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  ;.  while( n>1 &
5640: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b  & z[n-1]=='/' ){
5650: 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d   n--; }.  for(i=
5660: 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
5670: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f      if( z[i]=='/
5680: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
5690: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
56a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
56b0: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
56c0: 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+2<n && z[i+2]=
56d0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
56e0: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
56f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5700: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  }.      if( z[i+
5710: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e  1]=='.' && i+3<n
5720: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20   && z[i+2]=='.' 
5730: 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  && z[i+3]=='/' )
5740: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
5750: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d   j>0 && z[j-1]!=
5760: 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
5770: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b        if( j>0 ){
5780: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
5790: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
57a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
57b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
57c0: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
57d0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[j] = 0;.  ret
57e0: 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn j;.}../*.** 
57f0: 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69  Find a unique fi
5800: 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69  le ID for the gi
5810: 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74  ven absolute pat
5820: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a  hname.  Return.*
5830: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
5840: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
5850: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70   object.  This p
5860: 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e  ointer is the un
5870: 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e  ique.** file ID.
5880: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20  .**.** The nRef 
5890: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77  field of the vxw
58a0: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
58b0: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
58c0: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f   before.** the o
58d0: 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65  bject is returne
58e0: 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b  d.  A new vxwork
58f0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
5900: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
5910: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c   added to the gl
5920: 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63  obal list if nec
5930: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
5940: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
5950: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
5960: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  s, return NULL..
5970: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
5980: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
5990: 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
59a0: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  d(const char *zA
59b0: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20  bsoluteName){.  
59c0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
59d0: 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  leId *pNew;     
59e0: 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65      /* search ke
59f0: 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49  y and new file I
5a00: 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  D */.  struct vx
5a10: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61  worksFileId *pCa
5a20: 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f  ndidate;   /* Fo
5a30: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
5a40: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73  xisting file IDs
5a50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
5a80: 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65  gth of zAbsolute
5a90: 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  Name string */..
5aa0: 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c    assert( zAbsol
5ab0: 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  uteName[0]=='/' 
5ac0: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
5ad0: 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61  rlen(zAbsoluteNa
5ae0: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  me);.  pNew = sq
5af0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
5b00: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e  zeof(*pNew) + (n
5b10: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  +1) );.  if( pNe
5b20: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
5b30: 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  .  pNew->zCanoni
5b40: 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  calName = (char*
5b50: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d  )&pNew[1];.  mem
5b60: 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  cpy(pNew->zCanon
5b70: 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c  icalName, zAbsol
5b80: 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20  uteName, n+1);. 
5b90: 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70   n = vxworksSimp
5ba0: 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a  lifyName(pNew->z
5bb0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
5bc0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20  );..  /* Search 
5bd0: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
5be0: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
5bf0: 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61  ing the canonica
5c00: 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20  l name..  ** If 
5c10: 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74  found, increment
5c20: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
5c30: 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ount and return 
5c40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a  a pointer to.  *
5c50: 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66  * the existing f
5c60: 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75  ile ID..  */.  u
5c70: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
5c80: 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74  .  for(pCandidat
5c90: 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  e=vxworksFileLis
5ca0: 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70  t; pCandidate; p
5cb0: 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69  Candidate=pCandi
5cc0: 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  date->pNext){.  
5cd0: 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65    if( pCandidate
5ce0: 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20  ->nName==n .    
5cf0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64   && memcmp(pCand
5d00: 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61  idate->zCanonica
5d10: 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61  lName, pNew->zCa
5d20: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d  nonicalName, n)=
5d30: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
5d40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
5d50: 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e  ew);.       pCan
5d60: 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  didate->nRef++;.
5d70: 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
5d80: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
5d90: 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74  return pCandidat
5da0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  e;.    }.  }..  
5db0: 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20  /* No match was 
5dc0: 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20  found.  We will 
5dd0: 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20  make a new file 
5de0: 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52  ID */.  pNew->nR
5df0: 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e  ef = 1;.  pNew->
5e00: 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65  nName = n;.  pNe
5e10: 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72  w->pNext = vxwor
5e20: 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78  ksFileList;.  vx
5e30: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
5e40: 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76  pNew;.  unixLeav
5e50: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
5e60: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
5e70: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
5e80: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
5e90: 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65  on a vxworksFile
5ea0: 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65  Id object.  Free
5eb0: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77  .** the object w
5ec0: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
5ed0: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
5ee0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
5ef0: 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65  void vxworksRele
5f00: 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74  aseFileId(struct
5f10: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
5f20: 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65  pId){.  unixEnte
5f30: 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
5f40: 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20  rt( pId->nRef>0 
5f50: 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d  );.  pId->nRef--
5f60: 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65  ;.  if( pId->nRe
5f70: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  f==0 ){.    stru
5f80: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
5f90: 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70   **pp;.    for(p
5fa0: 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  p=&vxworksFileLi
5fb0: 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d  st; *pp && *pp!=
5fc0: 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70  pId; pp = &((*pp
5fd0: 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20  )->pNext)){}.   
5fe0: 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49   assert( *pp==pI
5ff0: 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70  d );.    *pp = p
6000: 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  Id->pNext;.    s
6010: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29  qlite3_free(pId)
6020: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
6030: 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64  eMutex();.}.#end
6040: 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
6050: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
6060: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71  **** End of Uniq
6070: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
6080: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
6090: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
60a0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
60b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60f0: 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
6100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6140: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
6150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6160: 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79  * Posix Advisory
6170: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
6180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6190: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49  *****.**.** POSI
61a0: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
61b0: 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64   are broken by d
61c0: 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44  esign.  ANSI STD
61d0: 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a   1003.1 (1996).*
61e0: 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e  * section 6.5.2.
61f0: 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f  2 lines 483 thro
6200: 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20  ugh 490 specify 
6210: 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63  that when a proc
6220: 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63  ess.** sets or c
6230: 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68  lears a lock, th
6240: 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65  at operation ove
6250: 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72  rrides any prior
6260: 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79   locks set.** by
6270: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
6280: 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  s.  It does not 
6290: 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73  explicitly say s
62a0: 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c  o, but this impl
62b0: 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f  ies.** that it o
62c0: 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73  verrides locks s
62d0: 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  et by the same p
62e0: 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64  rocess using a d
62f0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
6300: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f   descriptor.  Co
6310: 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74  nsider this test
6320: 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   case:.**.**    
6330: 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65     int fd1 = ope
6340: 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52  n("./file1", O_R
6350: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
6360: 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  4);.**       int
6370: 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd2 = open("./f
6380: 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile2", O_RDWR|O_
6390: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
63a0: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69  .** Suppose ./fi
63b0: 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20  le1 and ./file2 
63c0: 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73  are really the s
63d0: 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73  ame file (becaus
63e0: 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61  e.** one is a ha
63f0: 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c  rd or symbolic l
6400: 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72  ink to the other
6410: 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65  ) then if you se
6420: 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76  t.** an exclusiv
6430: 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74  e lock on fd1, t
6440: 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61  hen try to get a
6450: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
6460: 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77  .** on fd2, it w
6470: 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68  orks.  I would h
6480: 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65  ave expected the
6490: 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a   second lock to.
64a0: 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68  ** fail since th
64b0: 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  ere was already 
64c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
64d0: 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a  le due to fd1..*
64e0: 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53  * But not so.  S
64f0: 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20  ince both locks 
6500: 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61  came from the sa
6510: 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a  me process, the.
6520: 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69  ** second overri
6530: 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65  des the first, e
6540: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20  ven though they 
6550: 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e  were on differen
6560: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
6570: 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20  ptors opened on 
6580: 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e  different file n
6590: 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ames..**.** This
65a0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63   means that we c
65b0: 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20  annot use POSIX 
65c0: 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f  locks to synchro
65d0: 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73  nize file access
65e0: 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74  .** among compet
65f0: 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74  ing threads of t
6600: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
6610: 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69    POSIX locks wi
6620: 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20  ll work fine.** 
6630: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61  to synchronize a
6640: 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64  ccess for thread
6650: 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72  s in separate pr
6660: 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74  ocesses, but not
6670: 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68  .** threads with
6680: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
6690: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f  ess..**.** To wo
66a0: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72  rk around the pr
66b0: 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61  oblem, SQLite ha
66c0: 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65  s to manage file
66d0: 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c   locks internall
66e0: 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e  y.** on its own.
66f0: 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77    Whenever a new
6700: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
6710: 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ned, we have to 
6720: 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63  find the.** spec
6730: 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68  ific inode of th
6740: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6750: 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65  (the inode is de
6760: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a  termined by the.
6770: 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74  ** st_dev and st
6780: 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74  _ino fields of t
6790: 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72  he stat structur
67a0: 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66  e that fstat() f
67b0: 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20  ills in).** and 
67c0: 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20  check for locks 
67d0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67  already existing
67e0: 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20   on that inode. 
67f0: 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a   When locks are.
6800: 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65  ** created or re
6810: 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74  moved, we have t
6820: 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77  o look at our ow
6830: 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  n internal recor
6840: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  d of the.** lock
6850: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  s to see if anot
6860: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70  her thread has p
6870: 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20  reviously set a 
6880: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d  lock on that sam
6890: 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a  e.** inode..**.*
68a0: 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73  * (Aside: The us
68b0: 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65  e of inode numbe
68c0: 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73  rs as unique IDs
68d0: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
68e0: 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f  n VxWorks..** Fo
68f0: 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61  r VxWorks, we ha
6900: 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c  ve to use the al
6910: 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65  ternative unique
6920: 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64   ID system based
6930: 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c   on.** canonical
6940: 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d   filename and im
6950: 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65  plemented in the
6960: 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69   previous divisi
6970: 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  on.).**.** The s
6980: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
6990: 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20  cture for POSIX 
69a0: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73  is no longer jus
69b0: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c  t an integer fil
69c0: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e  e.** descriptor.
69d0: 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74    It is now a st
69e0: 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c  ructure that hol
69f0: 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66  ds the integer f
6a00: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
6a10: 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  r and a pointer 
6a20: 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74  to a structure t
6a30: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
6a40: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f  e internal.** lo
6a50: 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65  cks on the corre
6a60: 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20  sponding inode. 
6a70: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f   There is one lo
6a80: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a  cking structure.
6a90: 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f  ** per inode, so
6aa0: 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f   if the same ino
6ab0: 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69  de is opened twi
6ac0: 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c  ce, both unixFil
6ad0: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
6ae0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d  point to the sam
6af0: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
6b00: 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ure.  The lockin
6b10: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
6b20: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
6b30: 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69   count (so we wi
6b40: 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20  ll know when to 
6b50: 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61  delete it) and a
6b60: 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20   "cnt".** field 
6b70: 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74  that tells us it
6b80: 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  s internal lock 
6b90: 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20  status.  cnt==0 
6ba0: 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c  means the.** fil
6bb0: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  e is unlocked.  
6bc0: 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68  cnt==-1 means th
6bd0: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78  e file has an ex
6be0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a  clusive lock..**
6bf0: 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65   cnt>0 means the
6c00: 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65  re are cnt share
6c10: 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66  d locks on the f
6c20: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61  ile..**.** Any a
6c30: 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f  ttempt to lock o
6c40: 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  r unlock a file 
6c50: 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65  first checks the
6c60: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75   locking.** stru
6c70: 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74  cture.  The fcnt
6c80: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  l() system call 
6c90: 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  is only invoked 
6ca0: 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53  to set a .** POS
6cb0: 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69  IX lock if the i
6cc0: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72  nternal lock str
6cd0: 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f  ucture transitio
6ce0: 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20  ns between.** a 
6cf0: 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e  locked and an un
6d00: 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a  locked state..**
6d10: 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74  .** But wait:  t
6d20: 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72  here are yet mor
6d30: 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  e problems with 
6d40: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
6d50: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79  ocks..**.** If y
6d60: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20  ou close a file 
6d70: 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
6d80: 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65  points to a file
6d90: 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c   that has locks,
6da0: 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e  .** all locks on
6db0: 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
6dc0: 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65  are owned by the
6dd0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
6de0: 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64   are.** released
6df0: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
6e00: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20  d this problem, 
6e10: 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e  each unixInodeIn
6e20: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69  fo object.** mai
6e30: 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f  ntains a count o
6e40: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
6e50: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e  pending locks on
6e60: 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57   tha inode..** W
6e70: 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
6e80: 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20  s made to close 
6e90: 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20  an unixFile, if 
6ea0: 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68  there are.** oth
6eb0: 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e  er unixFile open
6ec0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f   on the same ino
6ed0: 64 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64  de that are hold
6ee0: 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63  ing locks, the c
6ef0: 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28  all.** to close(
6f00: 29 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  ) the file descr
6f10: 69 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65  iptor is deferre
6f20: 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74  d until all of t
6f30: 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a  he locks clear..
6f40: 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65  ** The unixInode
6f50: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b  Info structure k
6f60: 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66  eeps a list of f
6f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
6f80: 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20  that need to.** 
6f90: 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68  be closed and th
6fa0: 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65  at list is walke
6fb0: 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20  d (and cleared) 
6fc0: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
6fd0: 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a  ck.** clears..**
6fe0: 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20  .** Yet another 
6ff0: 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54  problem:  LinuxT
7000: 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c  hreads do not pl
7010: 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73  ay well with pos
7020: 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ix locks..**.** 
7030: 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69  Many older versi
7040: 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65  ons of linux use
7050: 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64   the LinuxThread
7060: 73 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20  s library which 
7070: 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20  is.** not posix 
7080: 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65  compliant.  Unde
7090: 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  r LinuxThreads, 
70a0: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
70b0: 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61  y thread.** A ca
70c0: 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64  nnot be modified
70d0: 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62   or overridden b
70e0: 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68  y a different th
70f0: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20  read B..** Only 
7100: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64  thread A can mod
7110: 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c  ify the lock.  L
7120: 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20  ocking behavior 
7130: 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66  is correct.** if
7140: 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20   the appliation 
7150: 75 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e  uses the newer N
7160: 61 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65  ative Posix Thre
7170: 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c  ad Library (NPTL
7180: 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20  ).** on linux - 
7190: 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b  with NPTL a lock
71a0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
71b0: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
71c0: 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68  e locks.** in th
71d0: 72 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65  read B.  But the
71e0: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
71f0: 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d  know at compile-
7200: 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68  time which.** th
7210: 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20  reading library 
7220: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20  is being used.  
7230: 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  So there is no w
7240: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a  ay to know at.**
7250: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
7260: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72  ether or not thr
7270: 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69  ead A can overri
7280: 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65  de locks on thre
7290: 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73  ad B..** One has
72a0: 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d   to do a run-tim
72b0: 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f  e check to disco
72c0: 76 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72  ver the behavior
72d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   of the.** curre
72e0: 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  nt process..**.*
72f0: 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f  * SQLite used to
7300: 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68   support LinuxTh
7310: 72 65 61 64 73 2e 20 20 42 75 74 20 73 75 70 70  reads.  But supp
7320: 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72  ort for LinuxThr
7330: 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70  eads.** was drop
7340: 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  ped beginning wi
7350: 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30  th version 3.7.0
7360: 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73  .  SQLite will s
7370: 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a  till work with.*
7380: 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70  * LinuxThreads p
7390: 72 6f 76 69 64 65 64 20 74 68 61 74 20 28 31 29  rovided that (1)
73a0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72   there is no mor
73b0: 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65  e than one conne
73c0: 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61  ction .** per da
73d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
73e0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
73f0: 61 6e 64 20 28 32 29 20 64 61 74 61 62 61 73 65  and (2) database
7400: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
7410: 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f  do not move acro
7420: 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a  ss threads..*/..
7430: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
7440: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
7450: 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72  ng structure ser
7460: 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75  ves as the key u
7470: 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65  sed.** to locate
7480: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e   a particular un
7490: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
74a0: 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  ct..*/.struct un
74b0: 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76  ixFileId {.  dev
74c0: 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20  _t dev;         
74d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
74e0: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66  ce number */.#if
74f0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
7500: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7510: 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69  Id *pId;  /* Uni
7520: 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20  que file ID for 
7530: 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73  vxworks. */.#els
7540: 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20  e.  ino_t ino;  
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7560: 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20  /* Inode number 
7570: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
7580: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
7590: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
75a0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
75b0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
75c0: 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20   open.** inode. 
75d0: 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72   Or, on LinuxThr
75e0: 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f  eads, there is o
75f0: 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 75  ne of these stru
7600: 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61  ctures for.** ea
7610: 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20  ch inode opened 
7620: 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a  by each thread..
7630: 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69  **.** A single i
7640: 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75  node can have mu
7650: 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63  ltiple file desc
7660: 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68  riptors, so each
7670: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
7680: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
7690: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
76a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
76b0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73   object and this
76c0: 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73  .** object keeps
76d0: 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20   a count of the 
76e0: 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69  number of unixFi
76f0: 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69  le pointing to i
7700: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  t..*/.struct uni
7710: 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73  xInodeInfo {.  s
7720: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
7730: 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f   fileId;       /
7740: 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79  * The lookup key
7750: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65   */.  int nShare
7760: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
7770: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7780: 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  of SHARED locks 
7790: 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 65 46  held */.  int eF
77a0: 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  ileLock;        
77b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
77c0: 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c   of SHARED_LOCK,
77d0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65   RESERVED_LOCK e
77e0: 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  tc. */.  int nRe
77f0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
7800: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7810: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
7820: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
7830: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
7840: 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
7850: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
7860: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
7870: 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64  d with this inod
7880: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
7890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
78a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
78b0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
78c0: 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  file locks */.  
78d0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
78e0: 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nused;          
78f0: 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64  /* Unused file d
7900: 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c  escriptors to cl
7910: 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ose */.  unixIno
7920: 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20  deInfo *pNext;  
7930: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
7940: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
7950: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  eInfo objects */
7960: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
7970: 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20   *pPrev;        
7980: 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f     /*    .... do
7990: 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23  ubly linked */.#
79a0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
79b0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
79c0: 5f 53 54 59 4c 45 29 0a 20 20 75 6e 73 69 67 6e  _STYLE).  unsign
79d0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
79e0: 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72  redByte;  /* for
79f0: 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73   AFP simulated s
7a00: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65  hared lock */.#e
7a10: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ndif.#if OS_VXWO
7a20: 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  RKS.  sem_t *pSe
7a30: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
7a40: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50        /* Named P
7a50: 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a  OSIX semaphore *
7a60: 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d  /.  char aSemNam
7a70: 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
7a80: 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ];  /* Name of t
7a90: 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  hat semaphore */
7aa0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
7ab0: 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c  * A lists of all
7ac0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
7ad0: 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
7ae0: 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  c unixInodeInfo 
7af0: 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a  *inodeList = 0;.
7b00: 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ./*.**.** This f
7b10: 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f  unction - unixLo
7b20: 67 45 72 72 6f 72 5f 78 28 29 2c 20 69 73 20 6f  gError_x(), is o
7b30: 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20  nly ever called 
7b40: 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a  via the macro.**
7b50: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e   unixLogError().
7b60: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76  .**.** It is inv
7b70: 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72  oked after an er
7b80: 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e  ror occurs in an
7b90: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64   OS function and
7ba0: 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a   errno has been.
7bb0: 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20  ** set. It logs 
7bc0: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  a message using 
7bd0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f  sqlite3_log() co
7be0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
7bf0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  rent value of.**
7c00: 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70   errno and, if p
7c10: 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d  ossible, the hum
7c20: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69  an-readable equi
7c30: 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65  valent from stre
7c40: 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72  rror() or.** str
7c50: 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a  error_r()..**.**
7c60: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
7c70: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
7c80: 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62  e macro should b
7c90: 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  e the error code
7ca0: 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65   that.** will be
7cb0: 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
7cc0: 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45  ite (e.g. SQLITE
7cd0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53  _IOERR_DELETE, S
7ce0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e  QLITE_CANTOPEN).
7cf0: 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62   .** The two sub
7d00: 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74  sequent argument
7d10: 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  s should be the 
7d20: 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66  name of the OS f
7d30: 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  unction that.** 
7d40: 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e  failed (e.g. "un
7d50: 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61  link", "open") a
7d60: 6e 64 20 74 68 65 20 74 68 65 20 61 73 73 6f 63  nd the the assoc
7d70: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
7d80: 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e  m path,.** if an
7d90: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e  y..*/.#define un
7da0: 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63  ixLogError(a,b,c
7db0: 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  )     unixLogErr
7dc0: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f  orAtLine(a,b,c,_
7dd0: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
7de0: 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  int unixLogError
7df0: 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72  AtLine(.  int er
7e00: 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  rcode,          
7e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
7e20: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
7e30: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7e40: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
7e50: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
7e60: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
7e70: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
7e80: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
7ea0: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
7eb0: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
7ec0: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
7ef0: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
7f00: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
7f10: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  /.){.  char *zEr
7f20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7f30: 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67         /* Messag
7f40: 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28  e from strerror(
7f50: 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ) or equivalent 
7f60: 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20  */.  int iErrno 
7f70: 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  = errno;        
7f80: 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79       /* Saved sy
7f90: 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62  scall error numb
7fa0: 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  er */..  /* If t
7fb0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72  his is not a thr
7fc0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53  eadsafe build (S
7fd0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
7fe0: 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20  ==0), then use. 
7ff0: 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72   ** the strerror
8000: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f  () function to o
8010: 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d  btain the human-
8020: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d  readable error m
8030: 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69  essage.  ** equi
8040: 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e  valent to errno.
8050: 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
8060: 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20  strerror_r()..  
8070: 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  */ .#if SQLITE_T
8080: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
8090: 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52  ined(HAVE_STRERR
80a0: 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72  OR_R).  char aEr
80b0: 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  r[80];.  memset(
80c0: 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aErr, 0, sizeof(
80d0: 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d  aErr));.  zErr =
80e0: 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20   aErr;..  /* If 
80f0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
8100: 50 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f  P (set by autoco
8110: 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f  nf scripts) or _
8120: 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69  _USE_GNU is defi
8130: 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ned,.  ** assume
8140: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
8150: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 74 68   provides the th
8160: 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66  e GNU version of
8170: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68   strerror_r() th
8180: 61 74 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  at .  ** returns
8190: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
81a0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
81b0: 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  g the error mess
81c0: 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65  age. That pointe
81d0: 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e  r .  ** may poin
81e0: 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20  t to aErr[], or 
81f0: 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  it may point to 
8200: 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72  some static stor
8210: 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a  age somewhere. .
8220: 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
8230: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
8240: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
8250: 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f  the POSIX versio
8260: 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72  n of .  ** strer
8270: 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61  ror_r(), which a
8280: 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e 20  lways writes an 
8290: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
82a0: 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a  to aErr[]..  **.
82b0: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65    ** If the code
82c0: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73   incorrectly ass
82d0: 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
82e0: 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f  the POSIX versio
82f0: 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61  n that is.  ** a
8300: 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72  vailable, the er
8310: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
8320: 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70   often be an emp
8330: 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61  ty string. Not a
8340: 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c  .  ** huge probl
8350: 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20  em. Incorrectly 
8360: 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20  concluding that 
8370: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
8380: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20  is available .  
8390: 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  ** could lead to
83a0: 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75   a segfault thou
83b0: 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  gh..  */.#if def
83c0: 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f  ined(STRERROR_R_
83d0: 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e  CHAR_P) || defin
83e0: 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20  ed(__USE_GNU).  
83f0: 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a  zErr = .# endif.
8400: 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72    strerror_r(iEr
8410: 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f  rno, aErr, sizeo
8420: 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c  f(aErr)-1);..#el
8430: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
8440: 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69  SAFE.  /* This i
8450: 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62  s a threadsafe b
8460: 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72  uild, but strerr
8470: 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76  or_r() is not av
8480: 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45  ailable. */.  zE
8490: 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20  rr = "";.#else. 
84a0: 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61   /* Non-threadsa
84b0: 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74  fe build, use st
84c0: 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a  rerror(). */.  z
84d0: 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69  Err = strerror(i
84e0: 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a  Errno);.#endif..
84f0: 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64    assert( errcod
8500: 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
8510: 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
8520: 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73   zPath = "";.  s
8530: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
8540: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e  de,.      "os_un
8550: 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73  ix.c:%d: (%d) %s
8560: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
8570: 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c    iLine, iErrno,
8580: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
8590: 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Err.  );..  retu
85a0: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
85b0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
85c0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
85d0: 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68  .** We assume th
85e0: 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73  at close() almos
85f0: 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20  t always works, 
8600: 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79  since it is only
8610: 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69   in a.** very si
8620: 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f  ck application o
8630: 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b  r on a very sick
8640: 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69   platform that i
8650: 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a  t might fail..**
8660: 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c   If it does fail
8670: 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68  , simply leak th
8680: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
8690: 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68  r, but do log th
86a0: 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  e.** error..**.*
86b0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69  * Note that it i
86c0: 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65  s not safe to re
86d0: 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65  try close() afte
86e0: 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68  r EINTR since th
86f0: 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  e.** file descri
8700: 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20  ptor might have 
8710: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 75  already been reu
8720: 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74  sed by another t
8730: 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20  hread..** So we 
8740: 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74  don't even try t
8750: 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
8760: 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c  n EINTR.  Just l
8770: 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  og the error.** 
8780: 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a  and move on..*/.
8790: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75  static void robu
87a0: 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c  st_close(unixFil
87b0: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c  e *pFile, int h,
87c0: 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20   int lineno){.  
87d0: 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29  if( osClose(h) )
87e0: 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  {.    unixLogErr
87f0: 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f  orAtLine(SQLITE_
8800: 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c  IOERR_CLOSE, "cl
8810: 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ose",.          
8820: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
8830: 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le ? pFile->zPat
8840: 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  h : 0, lineno);.
8850: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
8860: 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63  se all file desc
8870: 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74  riptors accumuat
8880: 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e  ed in the unixIn
8890: 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64  odeInfo->pUnused
88a0: 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69   list..*/ .stati
88b0: 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64  c void closePend
88c0: 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20  ingFds(unixFile 
88d0: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
88e0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
88f0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
8900: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
8910: 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65   *p;.  UnixUnuse
8920: 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  dFd *pNext;.  fo
8930: 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  r(p=pInode->pUnu
8940: 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  sed; p; p=pNext)
8950: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
8960: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75  >pNext;.    robu
8970: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
8980: 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p->fd, __LINE__)
8990: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
89a0: 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e  ee(p);.  }.  pIn
89b0: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30  ode->pUnused = 0
89c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
89d0: 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e  se a unixInodeIn
89e0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65  fo structure pre
89f0: 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
8a00: 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e  d by findInodeIn
8a10: 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fo()..**.** The 
8a20: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
8a30: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
8a40: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
8a50: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
8a60: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
8a70: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
8a80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
8a90: 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
8aa0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
8ab0: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
8ac0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
8ad0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
8ae0: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
8af0: 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 49  ld() );.  if( pI
8b00: 6e 6f 64 65 20 29 7b 0a 20 20 20 20 70 49 6e 6f  node ){.    pIno
8b10: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
8b20: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66  if( pInode->nRef
8b30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
8b40: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68  ert( pInode->pSh
8b50: 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20  mNode==0 );.    
8b60: 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
8b70: 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
8b80: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  if( pInode->pPre
8b90: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
8ba0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ert( pInode->pPr
8bb0: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64  ev->pNext==pInod
8bc0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
8bd0: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
8be0: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
8bf0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
8c00: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8c10: 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64  inodeList==pInod
8c20: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f  e );.        ino
8c30: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d  deList = pInode-
8c40: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
8c50: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
8c60: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
8c70: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
8c80: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  e->pNext->pPrev=
8c90: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
8ca0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
8cb0: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
8cc0: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
8cd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
8ce0: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
8cf0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8d00: 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73  Given a file des
8d10: 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20  criptor, locate 
8d20: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
8d30: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
8d40: 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20   describes that 
8d50: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
8d60: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
8d70: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
8d80: 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20    The.** return 
8d90: 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75  value might be u
8da0: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20  ninitialized if 
8db0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
8dc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
8dd0: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
8de0: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
8df0: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
8e00: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
8e10: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
8e20: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
8e30: 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f   Return an appro
8e40: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
8e50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8e60: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a   findInodeInfo(.
8e70: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
8e80: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
8e90: 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69   /* Unix file wi
8ea0: 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65  th file desc use
8eb0: 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a  d in the key */.
8ec0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
8ed0: 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20  **ppInode       
8ee0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75   /* Return the u
8ef0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
8f00: 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ect here */.){. 
8f10: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f30: 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72  /* System call r
8f40: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
8f50: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8f70: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
8f80: 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20  iptor for pFile 
8f90: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
8fa0: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
8fb0: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65      /* Lookup ke
8fc0: 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e  y for the unixIn
8fd0: 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72  odeInfo */.  str
8fe0: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
8ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
9000: 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
9010: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  formation */.  u
9020: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
9030: 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  node = 0;     /*
9040: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49   Candidate unixI
9050: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
9060: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e  */..  assert( un
9070: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
9080: 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c  ..  /* Get low-l
9090: 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  evel information
90a0: 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
90b0: 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64  that we can used
90c0: 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20   to.  ** create 
90d0: 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f  a unique name fo
90e0: 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  r the file..  */
90f0: 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  .  fd = pFile->h
9100: 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
9110: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
9120: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
9130: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9140: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
9150: 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20  def EOVERFLOW.  
9160: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
9170: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
9180: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
9190: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
91a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
91b0: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69  E_IOERR;.  }..#i
91c0: 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
91d0: 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61   /* On OS X on a
91e0: 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  n msdos filesyst
91f0: 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  em, the inode nu
9200: 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64  mber is reported
9210: 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  .  ** incorrectl
9220: 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20  y for zero-size 
9230: 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b  files.  See tick
9240: 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f  et #3260.  To wo
9250: 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74  rk.  ** around t
9260: 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20  his problem (we 
9270: 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75  consider it a bu
9280: 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53  g in OS X, not S
9290: 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61  QLite).  ** we a
92a0: 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74  lways increase t
92b0: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20  he file size to 
92c0: 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73  1 by writing a s
92d0: 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20  ingle byte.  ** 
92e0: 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69  prior to accessi
92f0: 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  ng the inode num
9300: 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79  ber.  The one by
9310: 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20  te written is.  
9320: 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20  ** an ASCII 'S' 
9330: 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20  character which 
9340: 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20  also happens to 
9350: 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  be the first byt
9360: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65  e.  ** in the he
9370: 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51  ader of every SQ
9380: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
9390: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
93a0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20  there.  ** is a 
93b0: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73  race condition s
93c0: 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72  uch that another
93d0: 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65   thread has alre
93e0: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20  ady populated.  
93f0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ** the first pag
9400: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
9410: 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20  e, no damage is 
9420: 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  done..  */.  if(
9430: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
9440: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66  ==0 && (pFile->f
9450: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
9460: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
9470: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20  )!=0 ){.    do{ 
9480: 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
9490: 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65   "S", 1); }while
94a0: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
94b0: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66  =EINTR );.    if
94c0: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
94d0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
94e0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
94f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9500: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OERR;.    }.    
9510: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
9520: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20   &statbuf);.    
9530: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
9540: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9550: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
9560: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9570: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
9580: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73  }.#endif..  mems
9590: 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73  et(&fileId, 0, s
95a0: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
95b0: 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73    fileId.dev = s
95c0: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23  tatbuf.st_dev;.#
95d0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
95e0: 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69  fileId.pId = pFi
95f0: 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20  le->pId;.#else. 
9600: 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74   fileId.ino = st
9610: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65  atbuf.st_ino;.#e
9620: 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20  ndif.  pInode = 
9630: 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69  inodeList;.  whi
9640: 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65  le( pInode && me
9650: 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70  mcmp(&fileId, &p
9660: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73  Inode->fileId, s
9670: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29  izeof(fileId)) )
9680: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70  {.    pInode = p
9690: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
96a0: 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d  }.  if( pInode==
96b0: 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  0 ){.    pInode 
96c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
96d0: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  ( sizeof(*pInode
96e0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ) );.    if( pIn
96f0: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
9700: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
9710: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
9720: 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c  emset(pInode, 0,
9730: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
9740: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
9750: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26  Inode->fileId, &
9760: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
9770: 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e  ileId));.    pIn
9780: 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ode->nRef = 1;. 
9790: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
97a0: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
97b0: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20    pInode->pPrev 
97c0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f  = 0;.    if( ino
97d0: 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69  deList ) inodeLi
97e0: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  st->pPrev = pIno
97f0: 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73  de;.    inodeLis
9800: 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65  t = pInode;.  }e
9810: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  lse{.    pInode-
9820: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a  >nRef++;.  }.  *
9830: 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ppInode = pInode
9840: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9850: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
9860: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
9870: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
9880: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9890: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
98a0: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
98b0: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
98c0: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
98d0: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
98e0: 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
98f0: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
9900: 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
9910: 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
9920: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
9930: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
9940: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
9950: 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
9960: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
9970: 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
9980: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
9990: 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  nt unixCheckRese
99a0: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
99b0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
99c0: 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
99d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
99e0: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
99f0: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
9a00: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
9a10: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
9a20: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
9a30: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
9a40: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
9a50: 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ; );..  assert( 
9a60: 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45  pFile );.  unixE
9a70: 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
9a80: 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
9a90: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
9aa0: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
9ab0: 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  /..  /* Check if
9ac0: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
9ad0: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
9ae0: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
9af0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
9b00: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
9b10: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
9b20: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
9b30: 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69   }..  /* Otherwi
9b40: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
9b50: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
9b60: 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ds it..  */.#ifn
9b70: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
9b80: 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
9b90: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
9ba0: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b  k lock;.    lock
9bb0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
9bc0: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
9bd0: 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45  _start = RESERVE
9be0: 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  D_BYTE;.    lock
9bf0: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20  .l_len = 1;.    
9c00: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
9c10: 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 20 28 2d  WRLCK;.    if (-
9c20: 31 20 3d 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69  1 == osFcntl(pFi
9c30: 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  le->h, F_GETLK, 
9c40: 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20 20 20 20  &lock)) {.      
9c50: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
9c60: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
9c70: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
9c80: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
9c90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
9ca0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
9cb0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
9cc0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
9cd0: 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  o;.    } else if
9ce0: 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46  ( lock.l_type!=F
9cf0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
9d00: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
9d10: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
9d20: 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
9d30: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
9d40: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
9d50: 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e  d %d %d (unix)\n
9d60: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
9d70: 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20   reserved));..  
9d80: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
9d90: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
9da0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
9db0: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
9dc0: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
9dd0: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
9de0: 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
9df0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
9e00: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
9e10: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
9e20: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
9e30: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
9e40: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
9e50: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
9e60: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
9e70: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
9e80: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
9e90: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
9ea0: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
9eb0: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
9ec0: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
9ed0: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
9ee0: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
9ef0: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
9f00: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
9f10: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
9f20: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
9f30: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
9f40: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
9f50: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
9f60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
9f70: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
9f80: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
9f90: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
9fa0: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
9fb0: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
9fc0: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
9fd0: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
9fe0: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
9ff0: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
a000: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
a010: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
a020: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
a030: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
a040: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
a050: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
a060: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
a070: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
a080: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
a090: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
a0a0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
a0b0: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
a0c0: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
a0d0: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c  int unixLock(sql
a0e0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
a0f0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
a100: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
a110: 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  g describes the 
a120: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
a130: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
a140: 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63  cks and.  ** loc
a150: 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  k transitions in
a160: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f   terms of the PO
a170: 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61  SIX advisory sha
a180: 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76  red and exclusiv
a190: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d  e.  ** lock prim
a1a0: 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72  itives (called r
a1b0: 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72  ead-locks and wr
a1c0: 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c  ite-locks below,
a1d0: 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63   to avoid.  ** c
a1e0: 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51  onfusion with SQ
a1f0: 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29  Lite lock names)
a200: 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  . The algorithms
a210: 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64   are complicated
a220: 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69  .  ** slightly i
a230: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f  n order to be co
a240: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69  mpatible with wi
a250: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69  ndows systems si
a260: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a  multaneously.  *
a270: 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  * accessing the 
a280: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
a290: 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74  le, in case that
a2a0: 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65   is ever require
a2b0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d  d..  **.  ** Sym
a2c0: 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20  bols defined in 
a2d0: 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74  os.h indentify t
a2e0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
a2f0: 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72  ' and the 'reser
a300: 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20  ved.  ** byte', 
a310: 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65  each single byte
a320: 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  s at well known 
a330: 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65  offsets, and the
a340: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
a350: 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e  ** range', a ran
a360: 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20  ge of 510 bytes 
a370: 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  at a well known 
a380: 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  offset..  **.  *
a390: 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  * To obtain a SH
a3a0: 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61  ARED lock, a rea
a3b0: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
a3c0: 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ed on the 'pendi
a3d0: 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20  ng.  ** byte'.  
a3e0: 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65  If this is succe
a3f0: 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20  ssful, a random 
a400: 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73  byte from the 's
a410: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
a420: 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c  range' is read-l
a430: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  ocked and the lo
a440: 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ck on the 'pendi
a450: 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65  ng byte' release
a460: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  d..  **.  ** A p
a470: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
a480: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
a490: 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  D lock after it 
a4a0: 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  has a SHARED loc
a4b0: 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56  k..  ** A RESERV
a4c0: 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  ED lock is imple
a4d0: 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69  mented by grabbi
a4e0: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
a4f0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73  on the.  ** 'res
a500: 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20  erved byte'. .  
a510: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
a520: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
a530: 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  n a PENDING lock
a540: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62   after it has ob
a550: 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48  tained a.  ** SH
a560: 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e  ARED lock. A PEN
a570: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70  DING lock is imp
a580: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
a590: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
a5a0: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27  ck.  ** on the '
a5b0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54  pending byte'. T
a5c0: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
a5d0: 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c   no new SHARED l
a5e0: 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a  ocks can be.  **
a5f0: 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65   obtained, but e
a600: 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c  xisting SHARED l
a610: 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ocks are allowed
a620: 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70   to persist. A p
a630: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73  rocess.  ** does
a640: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74   not have to obt
a650: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
a660: 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ock on the way t
a670: 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  o a PENDING lock
a680: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70  ..  ** This prop
a690: 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20  erty is used by 
a6a0: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f  the algorithm fo
a6b0: 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
a6c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
a6d0: 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68  ** after a crash
a6e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45  ..  **.  ** An E
a6f0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f  XCLUSIVE lock, o
a700: 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20  btained after a 
a710: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
a720: 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d  held, is.  ** im
a730: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
a740: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
a750: 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72  ock on the entir
a760: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
a770: 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63   ** range'. Sinc
a780: 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b  e all other lock
a790: 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64  s require a read
a7a0: 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20  -lock on one of 
a7b0: 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77  the bytes.  ** w
a7c0: 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65  ithin this range
a7d0: 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
a7e0: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63  hat no other loc
a7f0: 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74  ks are held on t
a800: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
a810: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
a820: 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65   reason a single
a830: 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   byte cannot be 
a840: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
a850: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
a860: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
a870: 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f  that some versio
a880: 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f  ns of windows do
a890: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61   not support rea
a8a0: 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a  d-locks. By.  **
a8b0: 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f   locking a rando
a8c0: 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61  m byte from a ra
a8d0: 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  nge, concurrent 
a8e0: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79  SHARED locks may
a8f0: 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e   exist.  ** even
a900: 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   if the locking 
a910: 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69  primitive used i
a920: 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65  s always a write
a930: 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e  -lock..  */.  in
a940: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a950: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
a960: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
a970: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
a980: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
a990: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
a9a0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
a9b0: 6b 3b 0a 20 20 69 6e 74 20 73 20 3d 20 30 3b 0a  k;.  int s = 0;.
a9c0: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30    int tErrno = 0
a9d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
a9e0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
a9f0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
aa00: 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69  was %s(%s,%d) pi
aa10: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
aa20: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
aa30: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
aa40: 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
aa50: 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
aa60: 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ck),.      azFil
aa70: 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
aa80: 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
aa90: 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70  ->nShared , getp
aaa0: 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  id()));..  /* If
aab0: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
aac0: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
aad0: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
aae0: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
aaf0: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
ab00: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
ab10: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
ab20: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
ab30: 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
ab40: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
ab50: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
ab60: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
ab70: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
ab80: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
ab90: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
aba0: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
abb0: 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e  y held) (unix)\n
abc0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
abd0: 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
abe0: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
abf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
ac00: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
ac10: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
ac20: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
ac30: 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
ac40: 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
ac50: 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
ac60: 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
ac70: 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
ac80: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
ac90: 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
aca0: 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
acb0: 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
acc0: 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
acd0: 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
ace0: 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
acf0: 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
ad00: 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
ad10: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
ad20: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
ad30: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
ad40: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
ad50: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
ad60: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
ad70: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
ad80: 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
ad90: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
ada0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
adb0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
adc0: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
add0: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
ade0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
adf0: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
ae00: 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
ae10: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
ae20: 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
ae30: 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
ae40: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
ae50: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
ae60: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
ae70: 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
ae80: 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
ae90: 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
aea0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
aeb0: 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
aec0: 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
aed0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
aee0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
aef0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
af00: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
af10: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
af20: 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
af30: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
af40: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
af50: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
af60: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
af70: 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
af80: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
af90: 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
afa0: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
afb0: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
afc0: 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
afd0: 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
afe0: 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
aff0: 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
b000: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
b010: 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
b020: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
b030: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
b040: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
b050: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
b060: 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
b070: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
b080: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
b090: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
b0a0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
b0b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
b0c0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
b0d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b0e0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
b0f0: 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
b100: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
b110: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
b120: 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
b130: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
b140: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
b150: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
b160: 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
b170: 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
b180: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
b190: 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
b1a0: 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
b1b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
b1c0: 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
b1d0: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
b1e0: 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
b1f0: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
b200: 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
b210: 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
b220: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
b230: 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  ET;.  if( eFileL
b240: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
b250: 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
b260: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
b270: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
b280: 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
b290: 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
b2a0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
b2b0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
b2c0: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
b2d0: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
b2e0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
b2f0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 73 20  ING_BYTE;.    s 
b300: 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  = osFcntl(pFile-
b310: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
b320: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d  ck);.    if( s==
b330: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45  (-1) ){.      tE
b340: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
b350: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
b360: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
b370: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
b380: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
b390: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
b3a0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
b3b0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
b3c0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
b3d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
b3e0: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
b3f0: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49    }.  }...  /* I
b400: 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
b410: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
b420: 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
b430: 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
b440: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
b450: 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
b460: 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
b470: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
b480: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
b490: 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
b4a0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
b4b0: 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
b4c0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
b4d0: 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20  leLock==0 );..  
b4e0: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
b4f0: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
b500: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b510: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
b520: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
b530: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
b540: 20 69 66 28 20 28 73 20 3d 20 6f 73 46 63 6e 74   if( (s = osFcnt
b550: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
b560: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d  TLK, &lock))==(-
b570: 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  1) ){.      tErr
b580: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
b590: 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  }.    /* Drop th
b5a0: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
b5b0: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
b5c0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
b5d0: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
b5e0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
b5f0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
b600: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
b610: 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69   if( osFcntl(pFi
b620: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
b630: 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20  &lock)!=0 ){.   
b640: 20 20 20 69 66 28 20 73 20 21 3d 20 2d 31 20 29     if( s != -1 )
b650: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
b660: 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77  s could happen w
b670: 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f  ith a network mo
b680: 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 74  unt */.        t
b690: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a  Errno = errno; .
b6a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
b6b0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
b6c0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
b6d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
b6e0: 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66  CK); .        if
b6f0: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
b700: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
b710: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
b720: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
b730: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
b740: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
b750: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
b760: 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( s==(-1) ){.  
b770: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
b780: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
b790: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
b7a0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
b7b0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
b7c0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
b7d0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
b7e0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
b7f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
b800: 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
b810: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
b820: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
b830: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
b840: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
b850: 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
b860: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
b870: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
b880: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
b890: 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
b8a0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
b8b0: 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
b8c0: 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
b8d0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
b8e0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d   this.    ** sam
b8f0: 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
b900: 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
b910: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
b920: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
b930: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
b940: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
b950: 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
b960: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
b970: 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
b980: 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
b990: 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
b9a0: 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
b9b0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
b9c0: 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
b9d0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
b9e0: 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
b9f0: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b  Lock );.    lock
ba00: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
ba10: 4b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 65  K;.    switch( e
ba20: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
ba30: 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f    case RESERVED_
ba40: 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f  LOCK:.        lo
ba50: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
ba60: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
ba70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ba80: 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f   case EXCLUSIVE_
ba90: 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f  LOCK:.        lo
baa0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
bab0: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
bac0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
bad0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
bae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
baf0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
bb00: 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
bb10: 20 20 7d 0a 20 20 20 20 73 20 3d 20 6f 73 46 63    }.    s = osFc
bb20: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
bb30: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
bb40: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
bb50: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
bb60: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
bb70: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
bb80: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
bb90: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
bba0: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
bbb0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
bbc0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
bbd0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
bbe0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
bbf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
bc00: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
bc10: 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
bc20: 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e  transaction-coun
bc30: 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b  ter change check
bc40: 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20  ing flags when. 
bc50: 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e   ** transitionin
bc60: 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20  g from a SHARED 
bc70: 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  to a RESERVED lo
bc80: 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a  ck.  The change.
bc90: 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44    ** from SHARED
bca0: 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72   to RESERVED mar
bcb0: 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ks the beginning
bcc0: 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a   of a normal.  *
bcd0: 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  * write operatio
bce0: 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75  n (not a hot jou
bcf0: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
bd00: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
bd10: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70  QLITE_OK.   && p
bd20: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
bd30: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
bd40: 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  && eFileLock==RE
bd50: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b  SERVED_LOCK.  ){
bd60: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e  .    pFile->tran
bd70: 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20  sCntrChng = 0;. 
bd80: 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
bd90: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  te = 0;.    pFil
bda0: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
bdb0: 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
bdc0: 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
bdd0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
bde0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
bdf0: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
be00: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
be10: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
be20: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
be30: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
be40: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
be50: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
be60: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
be70: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
be80: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
be90: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
bea0: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
beb0: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
bec0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
bed0: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
bee0: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
bef0: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
bf00: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
bf10: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
bf20: 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
bf30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
bf40: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
bf50: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
bf60: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
bf70: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
bf80: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
bf90: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
bfa0: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
bfb0: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
bfc0: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
bfd0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
bfe0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
bff0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
c000: 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  = pFile->pUnused
c010: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
c020: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
c030: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
c040: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
c050: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
c060: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
c070: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
c080: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
c090: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
c0a0: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
c0b0: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
c0c0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
c0d0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
c0e0: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
c0f0: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
c100: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
c110: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
c120: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
c130: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
c140: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
c150: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
c160: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
c170: 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53  .** If handleNFS
c180: 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20  Unlock is true, 
c190: 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64  then on downgrad
c1a0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
c1b0: 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a  _LOCK to SHARED.
c1c0: 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67  ** the byte rang
c1d0: 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
c1e0: 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68  o 2 parts and th
c1f0: 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20  e first part is 
c200: 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a  unlocked then.**
c210: 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c   set to a read l
c220: 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74  ock, then the ot
c230: 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70  her part is simp
c240: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68  ly unlocked.  Th
c250: 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f  is works .** aro
c260: 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44  und a bug in BSD
c270: 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f   NFS lockd (also
c280: 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20   seen on MacOSX 
c290: 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c  10.3+) that fail
c2a0: 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20  s to .** remove 
c2b0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
c2c0: 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20  n a region when 
c2d0: 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
c2e0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
c2f0: 74 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73  t _posixUnlock(s
c300: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
c310: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20   int eFileLock, 
c320: 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  int handleNFSUnl
c330: 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ock){.  unixFile
c340: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
c350: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
c360: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
c370: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
c380: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
c390: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
c3a0: 6e 74 20 68 3b 0a 20 20 69 6e 74 20 74 45 72 72  nt h;.  int tErr
c3b0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
c3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
c3d0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74  r code from syst
c3e0: 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a  em call errors *
c3f0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  /..  assert( pFi
c400: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
c410: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
c420: 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
c430: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
c440: 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
c450: 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65  ock,.      pFile
c460: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
c470: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
c480: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
c490: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20  node->nShared,. 
c4a0: 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b       getpid()));
c4b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
c4c0: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
c4d0: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
c4e0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
c4f0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
c500: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c510: 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
c520: 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70  Mutex();.  h = p
c530: 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64  File->h;.  pInod
c540: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
c550: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
c560: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
c570: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
c580: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
c590: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
c5a0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
c5b0: 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
c5c0: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
c5d0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
c5e0: 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69  enign(1);.    Si
c5f0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
c600: 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75  =(-1) ).    Simu
c610: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
c620: 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  n(0);..#ifndef N
c630: 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
c640: 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
c650: 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
c660: 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
c670: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
c680: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
c690: 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
c6a0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
c6b0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
c6c0: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
c6d0: 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
c6e0: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
c6f0: 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
c700: 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
c710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
c720: 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
c730: 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
c740: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
c750: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
c760: 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
c770: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
c780: 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
c790: 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
c7a0: 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
c7b0: 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
c7c0: 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
c7d0: 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
c7e0: 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
c7f0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
c800: 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 30 0a  n..    */.#if 0.
c810: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
c820: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
c830: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
c840: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d  pFile->dbUpdate=
c850: 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
c860: 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
c870: 68 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66  hng==1 );.#endif
c880: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
c890: 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23  rmalWrite = 0;.#
c8a0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f  endif..    /* do
c8b0: 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73  wngrading to a s
c8c0: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46  hared lock on NF
c8d0: 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72  S involves clear
c8e0: 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ing the write lo
c8f0: 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ck.    ** before
c900: 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68   establishing th
c910: 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20  e readlock - to 
c920: 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e  avoid a race con
c930: 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72  dition we downgr
c940: 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  ade.    ** the l
c950: 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c  ock in 2 blocks,
c960: 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66   so that part of
c970: 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20   the range will 
c980: 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  be covered by a 
c990: 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f  .    ** write lo
c9a0: 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73  ck until the res
c9b0: 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20  t is covered by 
c9c0: 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20  a read lock:.   
c9d0: 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57   **  1:   [WWWWW
c9e0: 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b  ].    **  2:   [
c9f0: 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33  ....W].    **  3
ca00: 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20  :   [RRRRW].    
ca10: 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d  **  4:   [RRRR.]
ca20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ca30: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
ca40: 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20 21  D_LOCK ){..#if !
ca50: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
ca60: 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e  _) || !SQLITE_EN
ca70: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
ca80: 4c 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  LE.      assert(
ca90: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
caa0: 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==0 );.#endif.#i
cab0: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
cac0: 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
cad0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
cae0: 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61  YLE.      if( ha
caf0: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b  ndleNFSUnlock ){
cb00: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64  .        off_t d
cb10: 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f  ivSize = SHARED_
cb20: 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20  SIZE - 1;.      
cb30: 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e    .        lock.
cb40: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
cb50: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
cb60: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
cb70: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
cb80: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
cb90: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
cba0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
cbb0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
cbc0: 66 28 20 6f 73 46 63 6e 74 6c 28 68 2c 20 46 5f  f( osFcntl(h, F_
cbd0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28  SETLK, &lock)==(
cbe0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
cbf0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
cc00: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
cc10: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
cc20: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
cc30: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
cc40: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  NLOCK);.        
cc50: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
cc60: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
cc70: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
cc80: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
cc90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
cca0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
ccb0: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
ccc0: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
ccd0: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
cce0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ccf0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
cd00: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
cd10: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
cd20: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
cd30: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
cd40: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
cd50: 66 28 20 6f 73 46 63 6e 74 6c 28 68 2c 20 46 5f  f( osFcntl(h, F_
cd60: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28  SETLK, &lock)==(
cd70: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
cd80: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
cd90: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
cda0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
cdb0: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
cdc0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  , SQLITE_IOERR_R
cdd0: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
cde0: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
cdf0: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
ce00: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
ce10: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
ce20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ce30: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
ce40: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
ce50: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
ce60: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
ce70: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ce80: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
ce90: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
cea0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
ceb0: 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b  D_FIRST+divSize;
cec0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
ced0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
cee0: 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  E-divSize;.     
cef0: 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 68     if( osFcntl(h
cf00: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
cf10: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
cf20: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
cf30: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
cf40: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
cf50: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
cf60: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
cf70: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
cf80: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
cf90: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
cfa0: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
cfb0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
cfc0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
cfd0: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
cfe0: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
cff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
d000: 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  se.#endif /* def
d010: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
d020: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
d030: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
d040: 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
d050: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d060: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
d070: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
d080: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
d090: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
d0a0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
d0b0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
d0c0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
d0d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 73  ;.        if( os
d0e0: 46 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b  Fcntl(h, F_SETLK
d0f0: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
d100: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
d110: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
d120: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d130: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
d140: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
d150: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
d160: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
d170: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
d180: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
d190: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d1a0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
d1b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d1c0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
d1d0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
d1e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d1f0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
d200: 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e  UNLCK;.    lock.
d210: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
d220: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
d230: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
d240: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
d250: 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65  _len = 2L;  asse
d260: 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  rt( PENDING_BYTE
d270: 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54  +1==RESERVED_BYT
d280: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 73 46  E );.    if( osF
d290: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
d2a0: 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b   &lock)!=(-1) ){
d2b0: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
d2c0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
d2d0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
d2e0: 65 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  e{.      tErrno 
d2f0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d300: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d310: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d320: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d330: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
d340: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
d350: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
d360: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d370: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
d380: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
d390: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
d3a0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69   }.  }.  if( eFi
d3b0: 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
d3c0: 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  ){.    /* Decrem
d3d0: 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
d3e0: 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
d3f0: 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
d400: 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
d410: 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
d420: 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
d430: 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
d440: 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
d450: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
d460: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
d470: 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
d480: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
d490: 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
d4a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d4b0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
d4c0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
d4d0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
d4e0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c  lock.l_start = l
d4f0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a  ock.l_len = 0L;.
d500: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
d510: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
d520: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
d530: 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
d540: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
d550: 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
d560: 20 20 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74        if( osFcnt
d570: 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  l(h, F_SETLK, &l
d580: 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)!=(-1) ){.  
d590: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
d5a0: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
d5b0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
d5c0: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
d5d0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
d5e0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
d5f0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
d600: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
d610: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
d620: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
d630: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
d640: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
d650: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
d660: 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
d670: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
d680: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
d690: 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
d6a0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
d6b0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
d6c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
d6d0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
d6e0: 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
d6f0: 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
d700: 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
d710: 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
d720: 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
d730: 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
d740: 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
d750: 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
d760: 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
d770: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
d780: 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
d790: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
d7a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
d7b0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
d7c0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
d7d0: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
d7e0: 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
d7f0: 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ds(pFile);.    }
d800: 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63  .  }...end_unloc
d810: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
d820: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
d830: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
d840: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
d850: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
d860: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d870: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
d880: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
d890: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
d8a0: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
d8b0: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
d8c0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
d8d0: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
d8e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
d8f0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
d900: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
d910: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
d920: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
d930: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
d940: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
d950: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
d960: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
d970: 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
d980: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
d990: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
d9a0: 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70 6f 73 69  {.  return _posi
d9b0: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
d9c0: 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  eLock, 0);.}../*
d9d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d9e0: 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70  n performs the p
d9f0: 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f  arts of the "clo
da00: 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69  se file" operati
da10: 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f  on .** common to
da20: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68   all locking sch
da30: 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20  emes. It closes 
da40: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e  the directory an
da50: 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65  d file.** handle
da60: 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76  s, if they are v
da70: 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61  alid, and sets a
da80: 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
da90: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
daa0: 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a  ucture to 0..**.
dab0: 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e  ** It is *not* n
dac0: 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64  ecessary to hold
dad0: 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20   the mutex when 
dae0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
daf0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20  called,.** even 
db00: 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d  on VxWorks.  A m
db10: 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71  utex will be acq
db20: 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  uired on VxWorks
db30: 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72   by the.** vxwor
db40: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
db50: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
db60: 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e  atic int closeUn
db70: 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66  ixFile(sqlite3_f
db80: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
db90: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
dba0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
dbb0: 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  f( pFile ){.    
dbc0: 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  if( pFile->dirfd
dbd0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62  >=0 ){.      rob
dbe0: 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
dbf0: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 20 5f   pFile->dirfd, _
dc00: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
dc10: 70 46 69 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b  pFile->dirfd=-1;
dc20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
dc30: 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
dc40: 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
dc50: 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68  (pFile, pFile->h
dc60: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
dc70: 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
dc80: 3b 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53 5f 56  ;.    }.#if OS_V
dc90: 58 57 4f 52 4b 53 0a 20 20 20 20 69 66 28 20 70  XWORKS.    if( p
dca0: 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20  File->pId ){.   
dcb0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
dcc0: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
dcd0: 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e    unlink(pFile->
dce0: 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
dcf0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
dd00: 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61      vxworksRelea
dd10: 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e  seFileId(pFile->
dd20: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  pId);.      pFil
dd30: 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 20 20  e->pId = 0;.    
dd40: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53 54  }.#endif.    OST
dd50: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25  RACE(("CLOSE   %
dd60: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
dd70: 29 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  ));.    OpenCoun
dd80: 74 65 72 28 2d 31 29 3b 0a 20 20 20 20 73 71 6c  ter(-1);.    sql
dd90: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
dda0: 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 20 20 6d  >pUnused);.    m
ddb0: 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
ddc0: 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
ddd0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
dde0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ddf0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
de00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
de10: 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65  unixClose(sqlite
de20: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
de30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
de40: 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
de50: 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
de60: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
de70: 29 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c  )id;.    unixUnl
de80: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
de90: 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
dea0: 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
deb0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26  pFile->pInode &&
dec0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
ded0: 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  nLock ){.      /
dee0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
def0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
df00: 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
df10: 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
df20: 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79   just.      ** y
df30: 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
df40: 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
df50: 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
df60: 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
df70: 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
df80: 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
df90: 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
dfa0: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
dfb0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
dfc0: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
dfd0: 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
dfe0: 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eared..      */.
dff0: 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67        setPending
e000: 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  Fd(pFile);.    }
e010: 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
e020: 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
e030: 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
e040: 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e  File(id);.    un
e050: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
e060: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e070: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
e080: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
e090: 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
e0a0: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
e0b0: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
e0c0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
e0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e110: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
e120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e160: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
e170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e180: 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
e190: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
e1a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e1b0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
e1c0: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
e1d0: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
e1e0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
e1f0: 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
e200: 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
e210: 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
e220: 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
e230: 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
e240: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
e250: 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
e260: 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
e270: 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
e280: 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
e290: 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
e2a0: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
e2b0: 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
e2c0: 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
e2d0: 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
e2e0: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
e2f0: 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
e300: 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
e310: 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
e320: 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
e330: 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
e340: 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
e350: 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
e360: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
e370: 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
e380: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
e390: 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
e3a0: 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
e3b0: 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
e3c0: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
e3d0: 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
e3e0: 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
e3f0: 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
e400: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
e410: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
e420: 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
e430: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
e440: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
e450: 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
e460: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
e470: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
e480: 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
e490: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
e4a0: 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
e4b0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
e4c0: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70  *NotUsed, int *p
e4d0: 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  ResOut){.  UNUSE
e4e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
e4f0: 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  sed);.  *pResOut
e500: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
e510: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
e520: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
e530: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
e540: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
e550: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
e560: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
e570: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
e580: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e590: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
e5a0: 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71   nolockUnlock(sq
e5b0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
e5c0: 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
e5d0: 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
e5e0: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
e5f0: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
e600: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e610: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
e620: 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
e630: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f  ic int nolockClo
e640: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
e650: 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  *id) {.  return 
e660: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
e670: 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}../*********
e680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
e690: 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b  f the no-op lock
e6a0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
e6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6c0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
e6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e710: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
e720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e760: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
e770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e780: 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20   Begin dot-file 
e790: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
e7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7b0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
e7c0: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
e7d0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
e7e0: 75 73 65 73 20 74 68 65 20 65 78 69 73 74 61 6e  uses the existan
e7f0: 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c  ce of separate l
e800: 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20  ock.** files in 
e810: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c  order to control
e820: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
e830: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77  atabase.  This w
e840: 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20  orks on just.** 
e850: 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65  about every file
e860: 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c  system imaginabl
e870: 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  e.  But there ar
e880: 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69  e serious downsi
e890: 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  des:.**.**    (1
e8a0: 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f  )  There is zero
e8b0: 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41   concurrency.  A
e8c0: 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62   single reader b
e8d0: 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a  locks all other.
e8e0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65  **         conne
e8f0: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64  ctions from read
e900: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
e910: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
e920: 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61 70  **    (2)  An ap
e930: 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20  plication crash 
e940: 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61  or power loss ca
e950: 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f  n leave stale lo
e960: 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20  ck files.**     
e970: 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75      sitting arou
e980: 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  nd that need to 
e990: 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61  be cleared manua
e9a0: 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72  lly..**.** Never
e9b0: 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f  theless, a dotlo
e9c0: 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72  ck is an appropr
e9d0: 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  iate locking mod
e9e0: 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a  e for use if no.
e9f0: 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
ea00: 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76 61   strategy is ava
ea10: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  ilable..**.** Do
ea20: 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f  tfile locking wo
ea30: 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  rks by creating 
ea40: 61 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  a file in the sa
ea50: 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
ea60: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
ea70: 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
ea80: 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
ea90: 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
eaa0: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
eab0: 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61  e existance of a
eac0: 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69   lock file impli
ead0: 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
eae0: 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
eaf0: 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28   lock.** types (
eb00: 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
eb10: 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
eb20: 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
eb30: 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
eb40: 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
eb50: 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
eb60: 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
eb70: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
eb80: 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66  te the.** lock f
eb90: 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
eba0: 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22  DOTLOCK_SUFFIX "
ebb0: 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68  .lock"../*.** Th
ebc0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
ebd0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
ebe0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
ebf0: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
ec00: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
ec10: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
ec20: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
ec30: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
ec40: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
ec50: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
ec60: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
ec70: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
ec80: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
ec90: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
eca0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
ecb0: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
ecc0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
ecd0: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
ece0: 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66  g..**.** In dotf
ecf0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74  ile locking, eit
ed00: 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74  her a lock exist
ed10: 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74  s or it does not
ed20: 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a  .  So in this.**
ed30: 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68   variation of Ch
ed40: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
ed50: 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  ), *pResOut is s
ed60: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e  et to true if an
ed70: 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c  y lock.** is hel
ed80: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  d on the file an
ed90: 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66  d false if the f
eda0: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
edb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
edc0: 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
edd0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
ede0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
edf0: 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
ee00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ee10: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
ee20: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
ee30: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
ee40: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
ee50: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
ee60: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
ee70: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
ee80: 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
ee90: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
eea0: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
eeb0: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
eec0: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
eed0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
eee0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
eef0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
ef00: 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73    /* Either this
ef10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73   connection or s
ef20: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
ef30: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65  tion in the same
ef40: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
ef50: 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20  holds a lock on 
ef60: 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65  the file.  No ne
ef70: 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74  ed to check furt
ef80: 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65  her. */.    rese
ef90: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  rved = 1;.  }els
efa0: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  e{.    /* The lo
efb0: 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e  ck is held if an
efc0: 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f  d only if the lo
efd0: 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  ckfile exists */
efe0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
eff0: 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f  *zLockFile = (co
f000: 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d  nst char*)pFile-
f010: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
f020: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
f030: 6f 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69  osAccess(zLockFi
f040: 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20  le, 0)==0;.  }. 
f050: 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
f060: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
f070: 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
f080: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
f090: 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73  erved));.  *pRes
f0a0: 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
f0b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f0c0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
f0d0: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
f0e0: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
f0f0: 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
f100: 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
f110: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
f120: 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
f130: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
f140: 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
f150: 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
f160: 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
f170: 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
f180: 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
f190: 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
f1a0: 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
f1b0: 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
f1c0: 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
f1d0: 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
f1e0: 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
f1f0: 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
f200: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
f210: 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
f220: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
f230: 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
f240: 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
f250: 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
f260: 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
f270: 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
f280: 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
f290: 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
f2a0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
f2b0: 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
f2c0: 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
f2d0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
f2e0: 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
f2f0: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
f300: 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
f310: 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
f320: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
f330: 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
f340: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
f350: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
f360: 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
f370: 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
f380: 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
f390: 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
f3a0: 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
f3b0: 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
f3c0: 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
f3d0: 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
f3e0: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66  .**.** With dotf
f3f0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20  ile locking, we 
f400: 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70  really only supp
f410: 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45  ort state (4): E
f420: 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74  XCLUSIVE..** But
f430: 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74   we track the ot
f440: 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  her locking leve
f450: 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a  ls internally..*
f460: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
f470: 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
f480: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
f490: 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
f4a0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
f4b0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
f4c0: 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20   int fd;.  char 
f4d0: 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
f4e0: 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
f4f0: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
f500: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
f510: 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
f520: 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
f530: 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
f540: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
f550: 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
f560: 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
f570: 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
f580: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
f590: 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
f5a0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
f5b0: 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
f5c0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
f5d0: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
f5e0: 6f 63 6b 3b 0a 23 69 66 20 21 4f 53 5f 56 58 57  ock;.#if !OS_VXW
f5f0: 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ORKS.    /* Alwa
f600: 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
f610: 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
f620: 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75  ld file */.    u
f630: 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
f640: 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
f650: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f660: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
f670: 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
f680: 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20  ve lock */.  fd 
f690: 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4c  = robust_open(zL
f6a0: 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59  ockFile,O_RDONLY
f6b0: 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c  |O_CREAT|O_EXCL,
f6c0: 30 36 30 30 29 3b 0a 20 20 69 66 28 20 66 64 3c  0600);.  if( fd<
f6d0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c  0 ){.    /* fail
f6e0: 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ed to open/creat
f6f0: 65 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65  e the file, some
f700: 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76  one else may hav
f710: 65 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63  e stolen the loc
f720: 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72  k */.    int tEr
f730: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f740: 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74   if( EEXIST == t
f750: 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
f760: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
f770: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
f780: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
f790: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
f7a0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
f7b0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
f7c0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
f7d0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
f7e0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
f7f0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
f800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f810: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f820: 7d 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  } .  robust_clos
f830: 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c  e(pFile, fd, __L
f840: 49 4e 45 5f 5f 29 3b 0a 20 20 0a 20 20 2f 2a 20  INE__);.  .  /* 
f850: 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
f860: 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
f870: 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65  ok */.  pFile->e
f880: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
f890: 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
f8a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
f8b0: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
f8c0: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
f8d0: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
f8e0: 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
f8f0: 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
f900: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
f910: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
f920: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
f930: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
f940: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
f950: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
f960: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
f970: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
f980: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
f990: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
f9a0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
f9b0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72   locking level r
f9c0: 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20  eaches NO_LOCK, 
f9d0: 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
f9e0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
f9f0: 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  int dotlockUnloc
fa00: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
fa10: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
fa20: 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
fa30: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
fa40: 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a  le*)id;.  char *
fa50: 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
fa60: 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
fa70: 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73  ngContext;..  as
fa80: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
fa90: 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
faa0: 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
fab0: 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29  pid=%d (dotlock)
fac0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
fad0: 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46  FileLock,..   pF
fae0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
faf0: 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73  getpid()));.  as
fb00: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
fb10: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
fb20: 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
fb30: 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
fb40: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
fb50: 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
fb60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
fb70: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
fb80: 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74  * To downgrade t
fb90: 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79  o shared, simply
fba0: 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
fbb0: 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74  rnal notion of t
fbc0: 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61  he.  ** lock sta
fbd0: 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  te.  No need to 
fbe0: 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69  mess with the fi
fbf0: 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  le on disk..  */
fc00: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
fc10: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
fc20: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
fc30: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
fc40: 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
fc50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
fc60: 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20   .  /* To fully 
fc70: 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
fc80: 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
fc90: 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61  lock file */.  a
fca0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
fcb0: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ==NO_LOCK );.  i
fcc0: 66 28 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46  f( unlink(zLockF
fcd0: 69 6c 65 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ile) ){.    int 
fce0: 72 63 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  rc = 0;.    int 
fcf0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
fd00: 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21      if( ENOENT !
fd10: 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
fd20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
fd30: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
fd40: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
fd50: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
fd60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
fd70: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
fd80: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
fd90: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
fda0: 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
fdb0: 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
fdc0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
fdd0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
fde0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fdf0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
fe00: 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  file.  Make sure
fe10: 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
fe20: 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f  en released befo
fe30: 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73  re closing..*/.s
fe40: 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
fe50: 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
fe60: 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
fe70: 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29 7b   rc;.  if( id ){
fe80: 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
fe90: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
fea0: 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63  *)id;.    dotloc
feb0: 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
fec0: 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OCK);.    sqlite
fed0: 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
fee0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
fef0: 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55   }.  rc = closeU
ff00: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 72  nixFile(id);.  r
ff10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a  eturn rc;.}./***
ff20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
ff30: 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66  End of the dot-f
ff40: 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ile lock impleme
ff50: 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
ff60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
ff70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 2a  **********/../**
ffc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a  ************.***
10010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10020 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c  ******* Begin fl
10030 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ock Locking ****
10040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
10060 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b  ** Use the flock
10070 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  () system call t
10080 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o do file lockin
10090 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  g..**.** flock()
100a0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
100b0 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e   dot-file lockin
100c0 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61  g in that the va
100d0 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72  rious.** fine-gr
100e0 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ain locking leve
100f0 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ls supported by 
10100 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61  SQLite are colla
10110 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  psed into.** a s
10120 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20  ingle exclusive 
10130 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  lock.  In other 
10140 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52  words, SHARED, R
10150 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20  ESERVED, and.** 
10160 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72  PENDING locks ar
10170 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  e the same thing
10180 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45   as an EXCLUSIVE
10190 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a   lock.  SQLite.*
101a0 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68  * still works wh
101b0 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20  en you do this, 
101c0 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20  but concurrency 
101d0 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65  is reduced since
101e0 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  .** only a singl
101f0 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65  e process can be
10200 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
10210 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e  abase at a time.
10220 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73  .**.** Omit this
10230 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49   section if SQLI
10240 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
10250 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65  G_STYLE is turne
10260 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63  d off or if.** c
10270 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57  ompiling for VXW
10280 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ORKS..*/.#if SQL
10290 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
102a0 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
102b0 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52  VXWORKS../*.** R
102c0 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c  etry flock() cal
102d0 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69 74  ls that fail wit
102e0 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65  h EINTR.*/.#ifde
102f0 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69  f EINTR.static i
10300 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  nt robust_flock(
10310 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b  int fd, int op){
10320 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
10330 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f   rc = flock(fd,o
10340 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  p); }while( rc<0
10350 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
10360 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
10370 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
10380 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61  e robust_flock(a
10390 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23  ,b) flock(a,b).#
103a0 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a  endif.     ../*.
103b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
103c0 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
103d0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
103e0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
103f0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
10400 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
10410 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
10420 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
10430 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
10440 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
10450 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
10460 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
10470 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
10480 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
10490 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
104a0 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
104b0 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
104c0 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
104d0 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
104e0 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b  c int flockCheck
104f0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
10500 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
10510 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
10520 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10530 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
10540 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
10550 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10560 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
10570 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
10580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
10590 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
105a0 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
105b0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
105c0 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
105d0 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
105e0 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
105f0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
10600 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
10610 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
10620 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
10630 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
10640 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
10650 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
10660 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
10670 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
10680 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61  rved ){.    /* a
10690 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68  ttempt to get th
106a0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
106b0 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  t lrc = robust_f
106c0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
106d0 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
106e0 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20  );.    if( !lrc 
106f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20  ){.      /* got 
10700 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  the lock, unlock
10710 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63   it */.      lrc
10720 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
10730 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
10740 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c  N);.      if ( l
10750 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69  rc ) {.        i
10760 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
10770 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e  o;.        /* un
10780 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68  lock failed with
10790 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
107a0 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
107b0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
107c0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
107d0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
107e0 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  ); .        if( 
107f0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
10800 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
10810 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
10820 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
10830 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
10840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10850 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
10860 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
10870 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
10880 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
10890 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
108a0 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20  e might have it 
108b0 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20  reserved */.    
108c0 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72    lrc = sqliteEr
108d0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
108e0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
108f0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20  _IOERR_LOCK); . 
10900 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
10910 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
10920 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
10930 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
10940 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
10950 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
10960 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
10970 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
10980 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c  d %d %d (flock)\
10990 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
109a0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23  , reserved));..#
109b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
109c0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
109d0 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
109e0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
109f0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
10a00 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
10a10 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72  TE_OK;.    reser
10a20 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  ved=1;.  }.#endi
10a30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
10a40 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
10a50 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f  RORS */.  *pResO
10a60 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
10a70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10a80 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
10a90 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
10aa0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
10ab0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
10ac0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
10ad0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
10ae0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
10af0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
10b00 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
10b10 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
10b20 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
10b30 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
10b40 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
10b50 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
10b60 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
10b70 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
10b80 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
10b90 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
10ba0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
10bb0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
10bc0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
10bd0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
10be0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
10bf0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
10c00 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
10c10 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
10c20 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
10c30 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
10c40 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
10c50 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
10c60 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
10c70 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
10c80 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
10c90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
10ca0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
10cb0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
10cc0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
10cd0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
10ce0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
10cf0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
10d00 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
10d10 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
10d20 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
10d30 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
10d40 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
10d50 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
10d60 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
10d70 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
10d80 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
10d90 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
10da0 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
10db0 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
10dc0 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
10dd0 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
10de0 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
10df0 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
10e00 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
10e10 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
10e20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10e30 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
10e40 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
10e50 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
10e60 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
10e70 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
10e80 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
10e90 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
10ea0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
10eb0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
10ec0 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
10ed0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10ee0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
10ef0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
10f00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
10f10 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  e );..  /* if we
10f20 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
10f30 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
10f40 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
10f50 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
10f60 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
10f70 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
10f80 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
10f90 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
10fa0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10fb0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
10fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10fd0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
10fe0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
10ff0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
11000 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f    if (robust_flo
11010 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
11020 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29  K_EX | LOCK_NB))
11030 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e   {.    int tErrn
11040 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f  o = errno;.    /
11050 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
11060 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
11070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
11080 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11090 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
110a0 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
110b0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
110c0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
110d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
110e0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
110f0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
11100 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
11110 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
11120 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69  rn ok */.    pFi
11130 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
11140 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  eFileLock;.  }. 
11150 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
11160 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f     %d %s %s (flo
11170 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
11180 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
11190 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
111a0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
111b0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
111c0 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53  led"));.#ifdef S
111d0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
111e0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
111f0 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
11200 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
11210 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
11220 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
11230 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
11240 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
11250 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
11260 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
11270 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
11280 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
11290 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
112a0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
112b0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
112c0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
112d0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
112e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
112f0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
11300 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
11310 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11320 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
11330 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
11340 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
11350 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
11360 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
11370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
11380 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
11390 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
113a0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
113b0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
113c0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
113d0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
113e0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
113f0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
11400 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
11410 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
11420 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
11430 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
11440 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
11450 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
11460 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
11470 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
11480 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
11490 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
114a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
114b0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
114c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
114d0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
114e0 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
114f0 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
11500 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
11510 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
11520 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
11530 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
11540 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11550 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
11560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11570 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
11580 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
11590 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  lock. */.  int r
115a0 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
115b0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
115c0 55 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b  UN);.  if (rc) {
115d0 0a 20 20 20 20 69 6e 74 20 72 2c 20 74 45 72 72  .    int r, tErr
115e0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
115f0 72 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  r = sqliteErrorF
11600 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
11610 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
11620 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
11630 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
11640 52 28 72 29 20 29 7b 0a 20 20 20 20 20 20 70 46  R(r) ){.      pF
11650 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11660 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23   tErrno;.    }.#
11670 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
11680 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
11690 52 52 4f 52 53 0a 20 20 20 20 69 66 28 20 28 72  RRORS.    if( (r
116a0 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
116b0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
116c0 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 53 51   ){.      r = SQ
116d0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
116e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
116f0 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
11700 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
11710 20 20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 3b    .    return r;
11720 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
11730 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11740 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
11750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11760 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
11770 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
11780 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
11790 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
117a0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
117b0 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55  id ){.    flockU
117c0 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
117d0 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  K);.  }.  return
117e0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
117f0 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  d);.}..#endif /*
11800 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
11810 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
11820 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f  !OS_VXWORK */../
11830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11840 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66  *** End of the f
11850 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  lock lock implem
11860 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
11870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a  *************/..
118d0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11930 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
11940 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c  amed Semaphore L
11950 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
11960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11970 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  **.** Named sema
11980 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
11990 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
119a0 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
119b0 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
119c0 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
119d0 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69  lock and flock i
119e0 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79  n that it really
119f0 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74   only.** support
11a00 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  s EXCLUSIVE lock
11a10 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ing.  Only a sin
11a20 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
11a30 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a  read or write.**
11a40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11a50 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  le at a time.  T
11a60 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65  his reduces pote
11a70 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63  ntial concurrenc
11a80 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20  y, but.** makes 
11a90 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  the lock impleme
11aa0 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73  ntation much eas
11ab0 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56  ier..*/.#if OS_V
11ac0 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
11ad0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
11ae0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
11af0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
11b00 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
11b10 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
11b20 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
11b30 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
11b40 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
11b50 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
11b60 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
11b70 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
11b80 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
11b90 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
11ba0 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
11bb0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
11bc0 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
11bd0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
11be0 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
11bf0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
11c00 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
11c10 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
11c20 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
11c30 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
11c40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11c50 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
11c60 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
11c70 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
11c80 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
11c90 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
11ca0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
11cb0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
11cc0 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
11cd0 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
11ce0 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
11cf0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
11d00 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
11d10 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
11d20 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
11d30 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
11d40 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
11d50 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
11d60 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
11d70 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
11d80 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
11d90 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
11da0 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
11db0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
11dc0 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Sem;.    struct 
11dd0 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20  stat statBuf;.. 
11de0 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
11df0 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
11e00 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
11e10 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
11e20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
11e30 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
11e40 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11e50 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11e60 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11e70 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
11e80 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
11e90 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11ea0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
11eb0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
11ec0 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
11ed0 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
11ee0 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
11ef0 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
11f00 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
11f10 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
11f20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
11f30 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
11f40 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75  .      /* we cou
11f50 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
11f60 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
11f70 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29    sem_post(pSem)
11f80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
11f90 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
11fa0 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73  LOCK %d %d %d (s
11fb0 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
11fc0 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
11fd0 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
11fe0 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
11ff0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12000 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
12010 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
12020 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
12030 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
12040 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
12050 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
12060 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
12070 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
12080 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
12090 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
120a0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
120b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
120c0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
120d0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
120e0 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
120f0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
12100 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
12110 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
12120 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
12130 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
12140 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
12150 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
12160 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
12170 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
12180 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
12190 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
121a0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
121b0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
121c0 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
121d0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
121e0 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
121f0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
12200 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
12210 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
12220 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
12230 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
12240 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
12250 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
12260 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
12270 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
12280 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
12290 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
122a0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
122b0 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
122c0 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  ks only really s
122d0 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
122e0 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
122f0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
12300 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
12310 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
12320 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
12330 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
12340 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
12350 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
12360 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
12370 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
12380 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
12390 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
123a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
123b0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
123c0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
123d0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
123e0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
123f0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
12400 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
12410 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
12420 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  mLock(sqlite3_fi
12430 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
12440 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
12450 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12460 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
12470 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  t fd;.  sem_t *p
12480 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
12490 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74  ode->pSem;.  int
124a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
124b0 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
124c0 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
124d0 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
124e0 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
124f0 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
12500 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
12510 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
12520 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
12530 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
12540 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12550 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
12560 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12570 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
12580 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
12590 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f   /* lock semapho
125a0 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20  re now but bail 
125b0 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79  out when already
125c0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66   locked. */.  if
125d0 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
125e0 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72  em)==-1 ){.    r
125f0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
12600 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
12610 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
12620 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
12630 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
12640 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
12650 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
12660 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e  leLock;.. sem_en
12670 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e  d_lock:.  return
12680 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
12690 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
126a0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
126b0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
126c0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
126d0 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
126e0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
126f0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
12700 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
12710 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
12720 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
12730 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
12740 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
12750 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
12760 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
12770 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
12780 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
12790 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69  t semUnlock(sqli
127a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
127b0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
127c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
127d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
127e0 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
127f0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
12800 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74  >pSem;..  assert
12810 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73  ( pFile );.  ass
12820 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f  ert( pSem );.  O
12830 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
12840 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
12850 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d=%d (sem)\n", p
12860 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
12870 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65  ck,..   pFile->e
12880 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
12890 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
128a0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
128b0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
128c0 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
128d0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
128e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
128f0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
12900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12910 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
12920 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
12930 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
12940 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
12950 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
12960 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
12970 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
12980 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12990 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
129a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
129b0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
129c0 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63  no, really unloc
129d0 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d  k. */.  if ( sem
129e0 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20  _post(pSem)==-1 
129f0 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20  ) {.    int rc, 
12a00 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
12a10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
12a20 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
12a30 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
12a40 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
12a50 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
12a60 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
12a70 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
12a80 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
12a90 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
12aa0 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
12ab0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
12ac0 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
12ad0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12ae0 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  . ** Close a fil
12af0 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e.. */.static in
12b00 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74  t semClose(sqlit
12b10 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
12b20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
12b30 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12b40 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12b50 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64      semUnlock(id
12b60 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
12b70 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
12b80 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
12b90 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61  tex();.    relea
12ba0 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
12bb0 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  e);.    unixLeav
12bc0 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c  eMutex();.    cl
12bd0 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
12be0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
12bf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
12c00 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
12c10 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20   */./*.** Named 
12c20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
12c30 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
12c40 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ble on VxWorks..
12c50 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12c60 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61  ** End of the na
12c70 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
12c80 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
12c90 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
12ca0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cf0 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
12d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d40 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
12d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d60 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69   Begin AFP Locki
12d70 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
12d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d90 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69  ****.**.** AFP i
12da0 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69  s the Apple Fili
12db0 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46  ng Protocol.  AF
12dc0 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66  P is a network f
12dd0 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a  ilesystem found.
12de0 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69  ** on Apple Maci
12df0 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20  ntosh computers 
12e00 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f  - both OS9 and O
12e10 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d  SX..**.** Third-
12e20 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61  party implementa
12e30 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65  tions of AFP are
12e40 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74   available.  But
12e50 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a   this code here.
12e60 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e  ** only works on
12e70 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65   OSX..*/..#if de
12e80 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
12e90 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
12ea0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
12eb0 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63  /*.** The afpLoc
12ec0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
12ed0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
12ee0 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63  ll afp lock spec
12ef0 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79  ific state.*/.ty
12f00 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
12f10 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
12f20 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
12f30 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
12f40 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  ingContext {.  i
12f50 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63  nt reserved;.  c
12f60 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
12f70 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
12f80 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
12f90 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73  en file */.};..s
12fa0 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
12fb0 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67  ockPB2.{.  unsig
12fc0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
12fd0 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
12fe0 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
12ff0 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  byte to lock */.
13000 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13010 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20  long length;    
13020 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79      /* nbr of by
13030 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
13040 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
13050 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72  ong retRangeStar
13060 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74  t; /* nbr of 1st
13070 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20   byte locked if 
13080 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20  successful */.  
13090 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e  unsigned char un
130a0 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20  LockFlag;       
130b0 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c    /* 1 = unlock,
130c0 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   0 = lock */.  u
130d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61  nsigned char sta
130e0 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20  rtEndFlag;      
130f0 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64   /* 1=rel to end
13100 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20   of fork, 0=rel 
13110 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e  to start */.  in
13120 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13140 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20  /* file desc to 
13150 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20  assoc this lock 
13160 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  with */.};..#def
13170 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e  ine afpfsByteRan
13180 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20  geLock2FSCTL    
13190 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32      _IOWR('z', 2
131a0 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
131b0 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a  ngeLockPB2)../*.
131c0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69  ** This is a uti
131d0 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67  lity for setting
131e0 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62   or clearing a b
131f0 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e  it-range lock on
13200 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73   an.** AFP files
13210 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65  ystem..** .** Re
13220 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
13230 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
13240 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72  E_BUSY on failur
13250 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13260 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63   afpSetLock(.  c
13270 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13290 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
132a0 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f  e to be locked o
132b0 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  r unlocked */.  
132c0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
132e0 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
132f0 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a  riptor on path *
13300 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
13310 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20  g long offset,  
13320 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
13330 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
13340 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
13350 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20   long length,   
13360 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
13370 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
13380 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61    int setLockFla
13390 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
133a0 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20   /* True to set 
133b0 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20  lock.  False to 
133c0 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  clear lock */.){
133d0 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61  .  struct ByteRa
133e0 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20  ngeLockPB2 pb;. 
133f0 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70   int err;.  .  p
13400 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73  b.unLockFlag = s
13410 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a  etLockFlag ? 0 :
13420 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e   1;.  pb.startEn
13430 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e  dFlag = 0;.  pb.
13440 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b  offset = offset;
13450 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c  .  pb.length = l
13460 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20  ength; .  pb.fd 
13470 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20  = pFile->h;.  . 
13480 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
13490 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25  TLOCK [%s] for %
134a0 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c  d%s in range %ll
134b0 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
134c0 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
134d0 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d  ":"OFF"), pFile-
134e0 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22  >h, (pb.fd==-1?"
134f0 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29  [testval-1]":"")
13500 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65  ,.    offset, le
13510 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20  ngth));.  err = 
13520 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66  fsctl(path, afpf
13530 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46  sByteRangeLock2F
13540 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20  SCTL, &pb, 0);. 
13550 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20   if ( err==-1 ) 
13560 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
13570 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
13580 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43  rrno;.    OSTRAC
13590 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66  E(("AFPSETLOCK f
135a0 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29  ailed to fsctl()
135b0 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a   '%s' %d %s\n",.
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74               pat
135d0 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72  h, tErrno, strer
135e0 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23  ror(tErrno)));.#
135f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
13600 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
13610 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ORS.    rc = SQL
13620 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a  ITE_BUSY;.#else.
13630 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
13640 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
13650 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  or(tErrno,.     
13660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
13670 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c  etLockFlag ? SQL
13680 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a  ITE_IOERR_LOCK :
13690 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
136a0 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  LOCK);.#endif /*
136b0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
136c0 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  FP_LOCK_ERRORS *
136d0 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  /.    if( IS_LOC
136e0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
136f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
13700 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
13710 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
13720 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
13730 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13740 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
13750 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13760 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
13770 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
13780 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
13790 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
137a0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
137b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
137c0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
137d0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
137e0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
137f0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
13800 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
13810 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
13820 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
13830 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
13840 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
13850 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
13860 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
13870 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
13880 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
13890 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
138a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
138b0 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
138c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
138d0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
138e0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
138f0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13900 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
13910 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
13920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
13930 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
13940 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
13950 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
13960 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13970 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
13980 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13990 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
139a0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28  ngContext;.  if(
139b0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
139c0 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f  ed ){.    *pResO
139d0 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ut = 1;.    retu
139e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
139f0 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
13a00 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
13a10 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
13a20 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
13a30 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20  threads */.  .  
13a40 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
13a50 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
13a60 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
13a70 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
13a80 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
13a90 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
13aa0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
13ab0 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
13ac0 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
13ad0 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
13ae0 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
13af0 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20  it..   */.  if( 
13b00 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
13b10 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53   /* lock the RES
13b20 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20  ERVED byte */.  
13b30 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53    int lrc = afpS
13b40 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
13b50 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
13b60 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
13b70 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51  1);  .    if( SQ
13b80 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a  LITE_OK==lrc ){.
13b90 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73        /* if we s
13ba0 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69  ucceeded in taki
13bb0 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20  ng the reserved 
13bc0 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
13bd0 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20  to restore.     
13be0 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
13bf0 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20   state */.      
13c00 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
13c10 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
13c20 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
13c30 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
13c40 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
13c50 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65    /* if we faile
13c60 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  d to get the loc
13c70 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65  k then someone e
13c80 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74  lse must have it
13c90 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76   */.      reserv
13ca0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
13cb0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
13cc0 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
13cd0 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a    rc=lrc;.    }.
13ce0 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
13cf0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
13d00 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
13d10 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66  OCK %d %d %d (af
13d20 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
13d30 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
13d40 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  .  .  *pResOut =
13d50 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
13d60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13d70 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
13d80 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
13d90 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
13da0 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
13db0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
13dc0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
13dd0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
13de0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
13df0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
13e00 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
13e10 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
13e20 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
13e30 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
13e40 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
13e50 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
13e60 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
13e70 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
13e80 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
13e90 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
13ea0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
13eb0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
13ec0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
13ed0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
13ee0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
13ef0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
13f00 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
13f10 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
13f20 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
13f30 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
13f40 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
13f50 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
13f60 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
13f70 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
13f80 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
13f90 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
13fa0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
13fb0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
13fc0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
13fd0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
13fe0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
13ff0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
14000 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
14010 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14020 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14030 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
14040 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
14050 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
14060 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
14070 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
14080 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
14090 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63  tatic int afpLoc
140a0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
140b0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
140c0 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
140d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
140e0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
140f0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
14100 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
14110 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
14120 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
14130 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
14140 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
14150 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
14160 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
14170 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
14180 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
14190 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
141a0 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
141b0 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
141c0 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
141d0 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
141e0 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
141f0 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
14200 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
14210 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
14220 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
14230 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ck), pInode->nSh
14240 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29  ared , getpid())
14250 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
14260 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
14270 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
14280 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
14290 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
142a0 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
142b0 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
142c0 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63   the afp_end_loc
142d0 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
142e0 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
142f0 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
14300 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
14310 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
14320 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
14330 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
14340 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
14350 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
14360 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c   held) (afp)\n",
14370 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
14380 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
14390 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
143a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
143b0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
143c0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
143d0 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
143e0 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28   correct.  **  (
143f0 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
14400 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
14410 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
14420 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
14430 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
14440 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
14450 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
14460 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
14470 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
14480 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
14490 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
144a0 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
144b0 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
144c0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
144d0 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
144e0 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
144f0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
14500 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
14510 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
14520 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
14530 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
14540 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
14550 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
14560 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
14570 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
14580 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
14590 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
145a0 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
145b0 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
145c0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
145d0 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
145e0 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66  pInode;..  /* If
145f0 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
14600 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
14610 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
14620 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
14630 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
14640 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
14650 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
14660 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
14670 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
14680 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
14690 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
146a0 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  .       (pInode-
146b0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
146c0 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
146d0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
146e0 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20  K)).     ){.    
146f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
14700 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
14710 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
14720 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
14730 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
14740 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
14750 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
14760 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
14770 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
14780 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
14790 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
147a0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
147b0 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
147c0 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
147d0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
147e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
147f0 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
14800 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
14810 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
14820 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
14830 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
14840 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
14850 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
14860 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
14870 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
14880 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
14890 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
148a0 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
148b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
148c0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
148d0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
148e0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
148f0 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
14900 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
14910 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
14920 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
14930 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
14940 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
14950 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
14960 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
14970 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
14980 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
14990 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
149a0 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
149b0 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
149c0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
149d0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
149e0 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
149f0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
14a00 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
14a10 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
14a20 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
14a30 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
14a40 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
14a50 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
14a60 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
14a70 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
14a80 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
14a90 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
14aa0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
14ab0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
14ac0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
14ad0 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
14ae0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
14af0 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
14b00 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
14b10 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
14b20 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
14b30 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
14b40 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
14b50 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
14b60 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63  K ){.    int lrc
14b70 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
14b80 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c  no;.    long lk,
14b90 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20   mask;.    .    
14ba0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
14bb0 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
14bc0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
14bd0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
14be0 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d  ;.        .    m
14bf0 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f  ask = (sizeof(lo
14c00 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53  ng)==8) ? LARGES
14c10 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66  T_INT64 : 0x7fff
14c20 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77  ffff;.    /* Now
14c30 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
14c40 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  ck SHARED_LOCK *
14c50 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68  /.    /* note th
14c60 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  at the quality o
14c70 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  f the randomness
14c80 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
14c90 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20  that much */.   
14ca0 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20   lk = random(); 
14cb0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61  .    pInode->sha
14cc0 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20  redByte = (lk & 
14cd0 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49  mask)%(SHARED_SI
14ce0 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63  ZE - 1);.    lrc
14cf0 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  1 = afpSetLock(c
14d00 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
14d10 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
14d20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70    SHARED_FIRST+p
14d30 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
14d40 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  e, 1, 1);.    if
14d50 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
14d60 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c  lrc1) ){.      l
14d70 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65  rc1Errno = pFile
14d80 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
14d90 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74   }.    /* Drop t
14da0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
14db0 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
14dc0 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f   lrc2 = afpSetLo
14dd0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
14de0 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
14df0 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
14e00 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f      .    if( IS_
14e10 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
14e20 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   ) {.      pFile
14e30 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72  ->lastErrno = lr
14e40 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  c1Errno;.      r
14e50 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20  c = lrc1;.      
14e60 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
14e70 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
14e80 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
14e90 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72  lrc2) ){.      r
14ea0 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20  c = lrc2;.      
14eb0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
14ec0 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
14ed0 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45  ( lrc1 != SQLITE
14ee0 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63  _OK ) {.      rc
14ef0 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65   = lrc1;.    } e
14f00 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  lse {.      pFil
14f10 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
14f20 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
14f30 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
14f40 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
14f50 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
14f60 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
14f70 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
14f80 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
14f90 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
14fa0 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
14fb0 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
14fc0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
14fd0 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
14fe0 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20  in this.     ** 
14ff0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
15000 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
15010 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
15020 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15030 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
15040 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
15050 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
15060 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
15070 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
15080 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
15090 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
150a0 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
150b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
150c0 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
150d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
150e0 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  failed = 0;.    
150f0 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
15100 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
15110 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b     if (eFileLock
15120 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   >= RESERVED_LOC
15130 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
15140 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44  eLock < RESERVED
15150 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
15160 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
15170 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
15180 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
15190 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
151a0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
151b0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
151c0 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66  , 1,1);.      if
151d0 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  ( !failed ){.   
151e0 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
151f0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
15200 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
15210 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69   (!failed && eFi
15220 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53  leLock == EXCLUS
15230 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
15240 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
15250 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
15260 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
15270 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
15280 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
15290 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
152a0 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
152b0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
152c0 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
152d0 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
152e0 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
152f0 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f  pUnlock.      */
15300 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69  .      if( !(fai
15310 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
15320 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
15330 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
15340 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15360 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
15370 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20  yte, 1, 0)) ){. 
15380 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65         int faile
15390 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  d2 = SQLITE_OK;.
153a0 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61          /* now a
153b0 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74  ttemmpt to get t
153c0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
153d0 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20  k range */.     
153e0 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
153f0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15400 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
15410 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20  HARED_FIRST, .  
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
15440 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20  RED_SIZE, 1);.  
15450 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64        if( failed
15460 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61   && (failed2 = a
15470 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15480 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
15490 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
154a0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
154b0 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d  _FIRST + pInode-
154c0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
154d0 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  1)) ){.         
154e0 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61   /* Can't reesta
154f0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
15500 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63   lock.  Sqlite c
15510 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20  an't deal, this 
15520 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
15530 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65  a critical I/O e
15540 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
15550 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
15560 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49   ((failed & SQLI
15570 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
15580 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69  ITE_IOERR) ? fai
15590 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20  led2 : .        
155a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
155b0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
155c0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
155d0 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  _lock;.        }
155e0 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
155f0 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
15600 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed; .      }.   
15610 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65   }.    if( faile
15620 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
15630 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
15640 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
15650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15660 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15670 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
15680 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
15690 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
156a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
156b0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
156c0 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
156d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
156e0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
156f0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
15700 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
15710 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
15720 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
15730 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
15740 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
15750 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29    %d %s %s (afp)
15760 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
15770 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
15780 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
15790 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
157a0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
157b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
157c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
157d0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
157e0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
157f0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
15800 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
15810 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
15820 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
15830 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
15840 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
15850 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
15860 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
15870 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
15880 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
15890 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
158a0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
158b0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
158c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
158d0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
158e0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
158f0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
15900 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15910 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15920 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15930 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
15940 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66  fo *pInode;.  af
15950 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
15960 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
15970 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
15980 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
15990 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b  ontext;.  int sk
159a0 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69  ipShared = 0;.#i
159b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
159c0 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65  .  int h = pFile
159d0 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ->h;.#endif..  a
159e0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
159f0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
15a00 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
15a10 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
15a20 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
15a30 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
15a40 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
15a50 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
15a60 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
15a70 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
15a80 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
15a90 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29          getpid()
15aa0 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
15ab0 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
15ac0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
15ad0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
15ae0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
15af0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15b00 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
15b10 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
15b20 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
15b30 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
15b40 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
15b50 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
15b60 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
15b70 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
15b80 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
15b90 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
15ba0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
15bb0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
15bc0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
15bd0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15be0 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
15bf0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
15c00 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
15c10 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
15c20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
15c30 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
15c40 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
15c50 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
15c60 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
15c70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
15c80 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
15c90 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
15ca0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
15cb0 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
15cc0 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
15cd0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
15ce0 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
15cf0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
15d00 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
15d10 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
15d20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
15d30 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
15d40 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
15d50 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
15d60 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
15d70 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
15d80 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
15d90 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
15da0 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
15db0 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
15dc0 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
15dd0 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
15de0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
15df0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
15e00 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
15e10 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
15e20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
15e30 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
15e40 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73   || pFile->trans
15e50 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20  CntrChng==1 );. 
15e60 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
15e70 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
15e80 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28  dif.    .    if(
15e90 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15ea0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
15eb0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
15ec0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
15ed0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15ee0 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
15ef0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
15f00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
15f10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
15f20 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
15f30 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
15f40 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20  nShared>1) ){.  
15f50 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65        /* only re
15f60 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
15f70 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65  hared lock if ne
15f80 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20  cessary */.     
15f90 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63     int sharedLoc
15fa0 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
15fb0 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
15fc0 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20  redByte;.       
15fd0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
15fe0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
15ff0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
16000 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
16010 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
16020 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65         skipShare
16030 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
16040 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
16050 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
16060 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
16070 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
16080 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
16090 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
160a0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
160b0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
160c0 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
160d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
160e0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
160f0 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
16100 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72  CK && context->r
16110 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20  eserved ){.     
16120 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
16130 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16140 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
16150 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
16160 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20       if( !rc ){ 
16170 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
16180 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20  ->reserved = 0; 
16190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
161a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
161b0 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
161c0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
161d0 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
161e0 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49  ed>1)){.      pI
161f0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
16200 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
16210 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
16220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16230 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
16240 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65  CK ){..    /* De
16250 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
16260 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
16270 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
16280 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
16290 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
162a0 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
162b0 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
162c0 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
162d0 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
162e0 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
162f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
16300 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  ng sharedLockByt
16310 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
16320 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
16330 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  yte;.    pInode-
16340 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
16350 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
16360 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
16370 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
16380 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
16390 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
163a0 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
163b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
163c0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
163d0 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20  if( !skipShared 
163e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
163f0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16400 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16410 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
16420 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
16430 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
16440 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
16450 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
16460 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
16470 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16480 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
16490 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
164a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
164b0 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
164c0 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20  >nLock--;.      
164d0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
164e0 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
164f0 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
16500 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
16510 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
16520 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
16530 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  }.    }.  }.  . 
16540 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
16550 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
16560 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
16570 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
16580 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
16590 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
165a0 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61  se a file & clea
165b0 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63  nup AFP specific
165c0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
165d0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
165e0 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  afpClose(sqlite3
165f0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
16600 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16610 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
16620 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
16630 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
16640 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63  id;.    afpUnloc
16650 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
16660 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
16670 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ex();.    if( pF
16680 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70  ile->pInode && p
16690 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
166a0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
166b0 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
166c0 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
166d0 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
166e0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
166f0 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74  ust.      ** yet
16700 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
16710 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
16720 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
16730 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
16740 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
16750 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65  r to pInode->aPe
16760 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
16770 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
16780 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
16790 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
167a0 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
167b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
167c0 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
167d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
167e0 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
167f0 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  File);.    sqlit
16800 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
16810 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
16820 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e      rc = closeUn
16830 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20  ixFile(id);.    
16840 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
16850 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16860 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
16870 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
16880 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
16890 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
168a0 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  E */./*.** The c
168b0 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65  ode above is the
168c0 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
168d0 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63  entation.  The c
168e0 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a  ode is specific.
168f0 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64  ** to MacOSX and
16900 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
16910 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61  n other unix pla
16920 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65  tforms.  No alte
16930 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76  rnative.** is av
16940 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75  ailable.  If you
16950 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66   don't compile f
16960 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74  or a mac, then t
16970 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a  he "unix-afp".**
16980 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69   VFS is not avai
16990 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  lable..**.******
169a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
169b0 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c  End of the AFP l
169c0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
169d0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
169e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
169f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a30 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
16a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
16a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16aa0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53  ****** Begin NFS
16ab0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
16ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20  *********/..#if 
16ae0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
16af0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
16b00 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
16b10 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74  E./*. ** Lower t
16b20 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
16b30 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
16b40 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
16b50 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
16b60 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65  ck. ** must be e
16b70 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
16b80 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a   SHARED_LOCK.. *
16b90 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  *. ** If the loc
16ba0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
16bb0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
16bc0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
16bd0 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65  or below. ** the
16be0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
16bf0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
16c00 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
16c10 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  p.. */.static in
16c20 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  t nfsUnlock(sqli
16c30 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
16c40 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
16c50 72 65 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c  return _posixUnl
16c60 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
16c70 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  k, 1);.}..#endif
16c80 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
16c90 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
16ca0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
16cb0 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
16cc0 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73  he code above is
16cd0 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
16ce0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
16cf0 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69  he code is speci
16d00 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58  fic.** to MacOSX
16d10 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f   and does not wo
16d20 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78  rk on other unix
16d30 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20   platforms.  No 
16d40 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69  alternative.** i
16d50 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a  s available.  .*
16d60 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
16d70 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
16d80 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c  he NFS lock impl
16d90 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
16da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16db0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
16dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e00 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
16e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e50 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
16e60 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20  *** Non-locking 
16e70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
16e80 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
16e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ea0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  **.**.** The nex
16eb0 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  t division conta
16ec0 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ins implementati
16ed0 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68  ons for all meth
16ee0 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ods of the .** s
16ef0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65  qlite3_file obje
16f00 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ct other than th
16f10 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
16f20 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a  s.  The locking.
16f30 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20  ** methods were 
16f40 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73  defined in divis
16f50 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20  ions above (one 
16f60 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70  locking method p
16f70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e  er.** division).
16f80 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20    Those methods 
16f90 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20  that are common 
16fa0 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d  to all locking m
16fb0 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68  odes.** are gath
16fc0 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f  er together into
16fd0 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a   this division..
16fe0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  */../*.** Seek t
16ff0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73  o the offset pas
17000 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
17010 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e  d argument, then
17020 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79   read cnt .** by
17030 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52  tes into pBuf. R
17040 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
17050 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
17060 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e  ly read..**.** N
17070 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e  B:  If you defin
17080 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55  e USE_PREAD or U
17090 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e  SE_PREAD64, then
170a0 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a   it might also.*
170b0 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
170c0 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
170d0 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30  SOURCE to be 500
170e0 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66  .  This varies f
170f0 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65  rom.** one syste
17100 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53  m to another.  S
17110 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73  ince SQLite does
17120 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f   not define USE_
17130 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79  PREAD.** any any
17140 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74   form by default
17150 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  , we will not at
17160 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20  tempt to define 
17170 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a  _XOPEN_SOURCE..*
17180 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32  * See tickets #2
17190 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a  741 and #2681..*
171a0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
171b0 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
171c0 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
171d0 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74  ed read the last
171e0 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
171f0 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
17200 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
17210 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
17220 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
17230 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
17240 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
17250 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
17260 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66  t got;.#if (!def
17270 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
17280 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f  && !defined(USE_
17290 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20  PREAD64)).  i64 
172a0 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69  newOffset;.#endi
172b0 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  f.  TIMER_START;
172c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
172d0 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f  _PREAD).  do{ go
172e0 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d 3e  t = osPread(id->
172f0 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
17300 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67  fset); }while( g
17310 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ot<0 && errno==E
17320 49 4e 54 52 20 29 3b 0a 20 20 53 69 6d 75 6c 61  INTR );.  Simula
17330 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
17340 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66   -1 );.#elif def
17350 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
17360 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73  ).  do{ got = os
17370 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  Pread64(id->h, p
17380 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
17390 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
173a0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
173b0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
173c0 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
173d0 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
173e0 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
173f0 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
17400 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  SET);.  Simulate
17410 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
17420 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65  et-- );.  if( ne
17430 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
17440 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  ){.    if( newOf
17450 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
17460 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
17470 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
17480 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73   errno;.    }els
17490 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  e{.      ((unixF
174a0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
174b0 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20  rno = 0;....    
174c0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  }.    return -1;
174d0 0a 20 20 7d 0a 20 20 64 6f 7b 20 67 6f 74 20 3d  .  }.  do{ got =
174e0 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70   osRead(id->h, p
174f0 42 75 66 2c 20 63 6e 74 29 3b 20 7d 77 68 69 6c  Buf, cnt); }whil
17500 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
17510 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64  o==EINTR );.#end
17520 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  if.  TIMER_END;.
17530 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
17540 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
17550 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
17560 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54  errno;.  }.  OST
17570 52 41 43 45 28 28 22 52 45 41 44 20 20 20 20 25  RACE(("READ    %
17580 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
17590 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f  lu\n", id->h, go
175a0 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52  t, offset, TIMER
175b0 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65  _ELAPSED));.  re
175c0 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a  turn got;.}../*.
175d0 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
175e0 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
175f0 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
17600 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
17610 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
17620 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
17630 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
17640 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
17650 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
17660 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
17670 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
17680 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
17690 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
176a0 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
176b0 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
176c0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
176d0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
176e0 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61  ;.  int got;.  a
176f0 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a 20 20  ssert( id );..  
17700 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
17710 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
17720 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
17730 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
17740 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
17750 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
17760 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
17770 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
17780 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
17790 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
177a0 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
177b0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
177c0 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
177d0 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
177e0 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
177f0 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
17800 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20  ;.#endif..  got 
17810 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
17820 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
17830 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67  f, amt);.  if( g
17840 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72  ot==amt ){.    r
17850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17860 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74  .  }else if( got
17870 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73  <0 ){.    /* las
17880 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
17890 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20  ekAndRead */.   
178a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
178b0 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  OERR_READ;.  }el
178c0 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
178d0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a  astErrno = 0; /*
178e0 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
178f0 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e  ror */.    /* Un
17900 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
17910 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
17920 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
17930 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
17940 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20  ar*)pBuf)[got], 
17950 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20  0, amt-got);.   
17960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
17970 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
17980 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
17990 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
179a0 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
179b0 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
179c0 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
179d0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
179e0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
179f0 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
17a00 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
17a10 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
17a20 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
17a30 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
17a40 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73  ed write the las
17a50 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
17a60 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
17a70 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
17a80 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
17a90 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ite(unixFile *id
17aa0 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f  , i64 offset, co
17ab0 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
17ac0 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
17ad0 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e  got;.#if (!defin
17ae0 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26  ed(USE_PREAD) &&
17af0 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52   !defined(USE_PR
17b00 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65  EAD64)).  i64 ne
17b10 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a  wOffset;.#endif.
17b20 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23    TIMER_START;.#
17b30 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
17b40 52 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20  READ).  do{ got 
17b50 3d 20 6f 73 50 77 72 69 74 65 28 69 64 2d 3e 68  = osPwrite(id->h
17b60 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
17b70 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f  set); }while( go
17b80 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
17b90 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66  NTR );.#elif def
17ba0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
17bb0 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73  ).  do{ got = os
17bc0 50 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20  Pwrite64(id->h, 
17bd0 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
17be0 74 29 3b 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  t);}while( got<0
17bf0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
17c00 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66  );.#else.  newOf
17c10 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d  fset = lseek(id-
17c20 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
17c30 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77  _SET);.  if( new
17c40 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
17c50 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  {.    if( newOff
17c60 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  set == -1 ){.   
17c70 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
17c80 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
17c90 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65  errno;.    }else
17ca0 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
17cb0 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
17cc0 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d  no = 0;....    }
17cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
17ce0 20 20 7d 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20    }.  do{ got = 
17cf0 6f 73 57 72 69 74 65 28 69 64 2d 3e 68 2c 20 70  osWrite(id->h, p
17d00 42 75 66 2c 20 63 6e 74 29 3b 20 7d 77 68 69 6c  Buf, cnt); }whil
17d10 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
17d20 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64  o==EINTR );.#end
17d30 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  if.  TIMER_END;.
17d40 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
17d50 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
17d60 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
17d70 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53  errno;.  }..  OS
17d80 54 52 41 43 45 28 28 22 57 52 49 54 45 20 20 20  TRACE(("WRITE   
17d90 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
17da0 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67  llu\n", id->h, g
17db0 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45  ot, offset, TIME
17dc0 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72  R_ELAPSED));.  r
17dd0 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f  eturn got;.}.../
17de0 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
17df0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
17e00 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
17e10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
17e20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
17e30 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
17e40 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
17e50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
17e60 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  ixWrite(.  sqlit
17e70 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
17e80 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
17e90 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
17ea0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
17eb0 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46  fset .){.  unixF
17ec0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
17ed0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
17ee0 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61  t wrote = 0;.  a
17ef0 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61  ssert( id );.  a
17f00 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
17f10 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
17f20 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
17f30 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
17f40 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
17f50 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
17f60 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
17f70 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
17f80 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
17f90 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
17fa0 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
17fb0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
17fc0 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
17fd0 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
17fe0 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
17ff0 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
18000 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
18010 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66    );.#endif..#if
18020 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
18030 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
18040 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
18050 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
18060 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74  le (as opposed t
18070 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68  o.  ** doing a h
18080 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
18090 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
180a0 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
180b0 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f  r than a.  ** no
180c0 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  rmal database fi
180d0 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20  le) then record 
180e0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
180f0 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
18100 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66  has changed.  If
18110 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18120 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69   counter is modi
18130 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61  fied, record tha
18140 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e  t.  ** fact too.
18150 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
18160 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
18170 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   ){.    pFile->d
18180 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a  bUpdate = 1;  /*
18190 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68 61   The database ha
181a0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
181b0 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  */.    if( offse
181c0 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b  t<=24 && offset+
181d0 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20  amt>=27 ){.     
181e0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63   int rc;.      c
181f0 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a  har oldCntr[4];.
18200 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
18210 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
18220 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41        rc = seekA
18230 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34  ndRead(pFile, 24
18240 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20  , oldCntr, 4);. 
18250 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18260 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
18270 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c       if( rc!=4 |
18280 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72  | memcmp(oldCntr
18290 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  , &((char*)pBuf)
182a0 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21  [24-offset], 4)!
182b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
182c0 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
182d0 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  ng = 1;  /* The 
182e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
182f0 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20  ter has changed 
18300 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
18310 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77  .  }.#endif..  w
18320 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28  hile( amt>0 && (
18330 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  wrote = seekAndW
18340 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  rite(pFile, offs
18350 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e  et, pBuf, amt))>
18360 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  0 ){.    amt -= 
18370 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65  wrote;.    offse
18380 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t += wrote;.    
18390 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29  pBuf = &((char*)
183a0 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20  pBuf)[wrote];.  
183b0 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  }.  SimulateIOEr
183c0 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29  ror(( wrote=(-1)
183d0 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69  , amt=1 ));.  Si
183e0 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
183f0 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61  ror(( wrote=0, a
18400 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20  mt=1 ));..  if( 
18410 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  amt>0 ){.    if(
18420 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20   wrote<0 ){.    
18430 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
18440 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69  et by seekAndWri
18450 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  te */.      retu
18460 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
18470 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
18480 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
18490 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a  astErrno = 0; /*
184a0 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
184b0 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ror */.      ret
184c0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
184d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
184e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
184f0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
18500 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  _TEST./*.** Coun
18510 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
18520 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f  fullsyncs and no
18530 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69  rmal syncs.  Thi
18540 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
18550 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20  t.** that syncs 
18560 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72  and fullsyncs ar
18570 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74  e occurring at t
18580 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
18590 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
185a0 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
185b0 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
185c0 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
185d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  endif../*.** We 
185e0 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73  do not trust sys
185f0 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20  tems to provide 
18600 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73  a working fdatas
18610 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e  ync().  Some do.
18620 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f  .** Others do no
18630 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77  .  To be safe, w
18640 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74  e will stick wit
18650 68 20 74 68 65 20 28 73 6c 6f 77 65 72 29 20 66  h the (slower) f
18660 73 79 6e 63 28 29 2e 0a 2a 2a 20 49 66 20 79 6f  sync()..** If yo
18670 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72  u know that your
18680 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70   system does sup
18690 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29  port fdatasync()
186a0 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74   correctly,.** t
186b0 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69  hen simply compi
186c0 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73  le with -Dfdatas
186d0 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f  ync=fdatasync.*/
186e0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66 64  .#if !defined(fd
186f0 61 74 61 73 79 6e 63 29 20 26 26 20 21 64 65 66  atasync) && !def
18700 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
18710 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79  # define fdatasy
18720 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a  nc fsync.#endif.
18730 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41  ./*.** Define HA
18740 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20  VE_FULLFSYNC to 
18750 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67  0 or 1 depending
18760 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
18770 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c  ot.** the F_FULL
18780 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  FSYNC macro is d
18790 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46  efined.  F_FULLF
187a0 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c  SYNC is currentl
187b0 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61  y.** only availa
187c0 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e  ble on Mac OS X.
187d0 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64    But that could
187e0 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64   change..*/.#ifd
187f0 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  ef F_FULLFSYNC.#
18800 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
18810 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23  LFSYNC 1.#else.#
18820 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
18830 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a  LFSYNC 0.#endif.
18840 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
18850 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
18860 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
18870 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
18880 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
18890 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
188a0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
188b0 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
188c0 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
188d0 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
188e0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
188f0 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
18900 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
18910 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
18920 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
18930 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
18940 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
18950 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
18960 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
18970 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
18980 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
18990 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
189a0 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
189b0 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
189c0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
189d0 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
189e0 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
189f0 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
18a00 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
18a10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
18a20 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73  *.** SQLite sets
18a30 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
18a40 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f  ag if the size o
18a50 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
18a60 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20  changed..** The 
18a70 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61  idea behind data
18a80 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20  Only is that it 
18a90 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74  should only writ
18aa0 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65  e the file conte
18ab0 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e  nt.** to disk, n
18ac0 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57  ot the inode.  W
18ad0 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f  e only set dataO
18ae0 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20  nly if the file 
18af0 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68  size is .** unch
18b00 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20  anged since the 
18b10 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72  file size is par
18b20 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20  t of the inode. 
18b30 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65   However, .** Te
18b40 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20  d Ts'o tells us 
18b50 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
18b60 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65   will also write
18b70 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68   the inode if th
18b80 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68  e.** file size h
18b90 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65  as changed.  The
18ba0 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65   only real diffe
18bb0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64  rence between fd
18bc0 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64  atasync().** and
18bd0 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65   fsync(), Ted te
18be0 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20  lls us, is that 
18bf0 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
18c00 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a   not flush the.*
18c10 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d  * inode if the m
18c20 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72  time or owner or
18c30 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74   other inode att
18c40 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61  ributes have cha
18c50 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79  nged..** We only
18c60 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
18c70 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74  file size, not t
18c80 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74  he other file at
18c90 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20  tributes, so.** 
18ca0 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65  as far as SQLite
18cb0 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61   is concerned, a
18cc0 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73  n fdatasync() is
18cd0 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65   always adequate
18ce0 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61  ..** So, we alwa
18cf0 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63  ys use fdatasync
18d00 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69  () if it is avai
18d10 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73  lable, regardles
18d20 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75  s of.** the valu
18d30 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c  e of the dataOnl
18d40 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69  y flag..*/.stati
18d50 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
18d60 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
18d70 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
18d80 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
18d90 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
18da0 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f  ing "ifdef/elif/
18db0 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73  else/" block has
18dc0 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74   the same struct
18dd0 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ure as.  ** the 
18de0 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73  one below. It is
18df0 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65   replicated here
18e00 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64   solely to avoid
18e10 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a   cluttering .  *
18e20 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f  * up the real co
18e30 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53  de with the UNUS
18e40 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d  ED_PARAMETER() m
18e50 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  acros..  */.#ifd
18e60 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
18e70 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
18e80 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
18e90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
18ea0 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
18eb0 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
18ec0 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45  nly);.#elif HAVE
18ed0 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55  _FULLFSYNC.  UNU
18ee0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
18ef0 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20  taOnly);.#else. 
18f00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18f10 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
18f20 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
18f30 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69  dataOnly);.#endi
18f40 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  f..  /* Record t
18f50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
18f60 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20  es that we do a 
18f70 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61  normal fsync() a
18f80 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e  nd .  ** FULLSYN
18f90 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  C.  This is used
18fa0 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
18fb0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
18fc0 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20  his procedure.  
18fd0 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ** gets called w
18fe0 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
18ff0 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  arguments..  */.
19000 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
19010 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  ST.  if( fullSyn
19020 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  c ) sqlite3_full
19030 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
19040 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
19050 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
19060 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
19070 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
19080 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
19090 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
190a0 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
190b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
190c0 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53  NO_SYNC.  rc = S
190d0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20  QLITE_OK;.#elif 
190e0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
190f0 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
19100 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
19110 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e  l(fd, F_FULLFSYN
19120 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  C, 0);.  }else{.
19130 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
19140 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
19150 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61  FSYNC failed, fa
19160 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d  ll back to attem
19170 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29  pting an fsync()
19180 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64  ..  ** It should
19190 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  n't be possible 
191a0 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f  for fullfsync to
191b0 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   fail on the loc
191c0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79  al .  ** file sy
191d0 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73  stem (on OSX), s
191e0 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61  o failure indica
191f0 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59  tes that FULLFSY
19200 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75  NC.  ** isn't su
19210 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73  pported for this
19220 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f   file system. So
19230 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79  , attempt an fsy
19240 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f  nc .  ** and (fo
19250 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68  r now) ignore th
19260 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
19270 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74  superfluous fcnt
19280 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49  l call.  .  ** I
19290 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  t'd be better to
192a0 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e   detect fullfsyn
192b0 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61  c support once a
192c0 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74  nd avoid .  ** t
192d0 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76  he fcntl call ev
192e0 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73  ery time sync is
192f0 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20   called..  */.  
19300 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
19310 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20  ync(fd);..#elif 
19320 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
19330 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e  _).  /* fdatasyn
19340 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73  c() on HFS+ does
19350 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68  n't yet flush th
19360 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69  e file size if i
19370 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63  t changed correc
19380 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72  tly.  ** so curr
19390 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74  ently we default
193a0 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68   to the macro th
193b0 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61  at redefines fda
193c0 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a  tasync to fsync.
193d0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e    */.  rc = fsyn
193e0 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20  c(fd);.#else .  
193f0 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
19400 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
19410 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20  KS.  if( rc==-1 
19420 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55  && errno==ENOTSU
19430 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  P ){.    rc = fs
19440 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
19450 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
19460 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69  S */.#endif /* i
19470 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
19480 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55  YNC elif HAVE_FU
19490 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66  LLFSYNC */..  if
194a0 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
194b0 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72  rc!= -1 ){.    r
194c0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
194d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
194e0 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
194f0 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
19500 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
19510 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
19520 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
19530 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
19540 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
19550 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
19560 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
19570 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
19580 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
19590 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
195a0 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
195b0 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
195c0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
195d0 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
195e0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
195f0 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
19600 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
19610 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
19620 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
19630 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
19640 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
19650 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
19660 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
19670 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
19680 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
19690 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
196a0 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
196b0 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
196c0 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
196d0 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
196e0 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
196f0 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
19700 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
19710 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
19720 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
19730 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
19740 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
19750 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
19760 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
19770 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
19780 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
19790 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
197a0 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
197b0 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
197c0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
197d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
197e0 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
197f0 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
19800 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
19810 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
19820 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
19830 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
19840 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
19850 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
19860 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
19870 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
19880 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
19890 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
198a0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
198b0 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
198c0 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
198d0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
198e0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
198f0 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
19900 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
19910 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
19920 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
19930 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
19940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
19950 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
19960 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
19970 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
19980 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
19990 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
199a0 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
199b0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
199c0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
199d0 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
199e0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
199f0 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20  TRACE(("SYNC    
19a00 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
19a10 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  h));.  rc = full
19a20 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
19a30 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
19a40 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
19a50 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
19a60 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
19a70 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
19a80 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
19a90 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
19aa0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
19ab0 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c  ERR_FSYNC, "full
19ac0 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e  _fsync", pFile->
19ad0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66  zPath);.  }.  if
19ae0 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d  ( pFile->dirfd>=
19af0 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
19b00 28 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20  (("DIRSYNC %-3d 
19b10 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d  (have_fullfsync=
19b20 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c  %d fullsync=%d)\
19b30 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  n", pFile->dirfd
19b40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41  ,.            HA
19b50 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73  VE_FULLFSYNC, is
19b60 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 23 69 66 6e  Fullsync));.#ifn
19b70 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
19b80 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f  LE_DIRSYNC.    /
19b90 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
19ba0 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74  sync is only att
19bb0 65 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66  empted if full_f
19bc0 73 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74  sync is.    ** t
19bd0 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61  urned off or una
19be0 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20  vailable.  If a 
19bf0 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72  full_fsync occur
19c00 72 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a  red above,.    *
19c10 2a 20 74 68 65 6e 20 74 68 65 20 64 69 72 65 63  * then the direc
19c20 74 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75 70  tory sync is sup
19c30 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f  erfluous..    */
19c40 0a 20 20 20 20 69 66 28 20 28 21 48 41 56 45 5f  .    if( (!HAVE_
19c50 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73  FULLFSYNC || !is
19c60 46 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c  Fullsync) && ful
19c70 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64  l_fsync(pFile->d
19c80 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20  irfd,0,0) ){.   
19c90 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a      /*.       **
19ca0 20 57 65 20 68 61 76 65 20 72 65 63 65 69 76 65   We have receive
19cb0 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72  d multiple repor
19cc0 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65  ts of fsync() re
19cd0 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a  turning.       *
19ce0 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70  * errors when ap
19cf0 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f  plied to directo
19d00 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20  ries on certain 
19d10 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20  file systems..  
19d20 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64       ** A failed
19d30 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   directory sync 
19d40 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61  is not a big dea
19d50 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a  l.  So it seems.
19d60 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72         ** better
19d70 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65   to ignore the e
19d80 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31  rror.  Ticket #1
19d90 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  657.       */.  
19da0 20 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c       /* pFile->l
19db0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
19dc0 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72  ; */.       /* r
19dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19de0 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e  RR; */.    }.#en
19df0 64 69 66 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  dif.    /* Only 
19e00 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63  need to sync onc
19e10 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20  e, so close the 
19e20 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 6e 20   directory when 
19e30 77 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20  we are done */. 
19e40 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
19e50 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 64 69  pFile, pFile->di
19e60 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  rfd, __LINE__);.
19e70 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64      pFile->dirfd
19e80 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74   = -1;.  }.  ret
19e90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19ea0 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
19eb0 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
19ec0 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
19ed0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75  atic int unixTru
19ee0 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
19ef0 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74  le *id, i64 nByt
19f00 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  e){.  unixFile *
19f10 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
19f20 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  e *)id;.  int rc
19f30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
19f40 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
19f50 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
19f60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
19f70 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  CATE );..  /* If
19f80 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f   the user has co
19f90 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b  nfigured a chunk
19fa0 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66  -size for this f
19fb0 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68  ile, truncate th
19fc0 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74  e.  ** file so t
19fd0 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20  hat it consists 
19fe0 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  of an integer nu
19ff0 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28  mber of chunks (
1a000 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63  i.e. the.  ** ac
1a010 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61  tual file size a
1a020 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  fter the operati
1a030 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72  on may be larger
1a040 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
1a050 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a  ted.  ** size)..
1a060 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1a070 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20  ->szChunk ){.   
1a080 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
1a090 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
1a0a0 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
1a0b0 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
1a0c0 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
1a0d0 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75  rc = robust_ftru
1a0e0 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1a0f0 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20  (off_t)nByte);. 
1a100 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70   if( rc ){.    p
1a110 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1a120 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  = errno;.    ret
1a130 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1a140 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1a150 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1a160 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1a170 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
1a180 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
1a190 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1a1a0 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
1a1b0 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
1a1c0 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
1a1d0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67   to.    ** doing
1a1e0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1a1f0 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
1a200 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
1a210 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20  other than a.   
1a220 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62   ** normal datab
1a230 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65  ase file) and we
1a240 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
1a250 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
1a260 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65  h,.    ** that e
1a270 66 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74  ffectively updat
1a280 65 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  es the change co
1a290 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67  unter.  This mig
1a2a0 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a  ht happen.    **
1a2b0 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20   when restoring 
1a2c0 61 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  a database using
1a2d0 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
1a2e0 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  from a zero-leng
1a2f0 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65  th.    ** source
1a300 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a310 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
1a320 57 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d  Write && nByte==
1a330 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
1a340 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1a350 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
1a360 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  f..    return SQ
1a370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
1a380 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
1a390 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1a3a0 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79   of a file in by
1a3b0 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tes.*/.static in
1a3c0 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73  t unixFileSize(s
1a3d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1a3e0 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
1a3f0 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74  int rc;.  struct
1a400 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73   stat buf;.  ass
1a410 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20  ert( id );.  rc 
1a420 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78  = osFstat(((unix
1a430 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62  File*)id)->h, &b
1a440 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  uf);.  SimulateI
1a450 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
1a460 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1a470 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1a480 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
1a490 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1a4a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1a4b0 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
1a4c0 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
1a4d0 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65  ;..  /* When ope
1a4e0 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65  ning a zero-size
1a4f0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
1a500 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70  indInodeInfo() p
1a510 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72  rocedure.  ** wr
1a520 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79  ites a single by
1a530 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c  te into that fil
1a540 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f  e in order to wo
1a550 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a  rk around a bug.
1a560 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58    ** in the OS-X
1a570 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
1a580 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  m.  In order to 
1a590 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77  avoid problems w
1a5a0 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c  ith upper.  ** l
1a5b0 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74  ayers, we need t
1a5c0 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69  o report this fi
1a5d0 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20  le size as zero 
1a5e0 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
1a5f0 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e  s.  ** really 1.
1a600 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e     Ticket #3260.
1a610 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69  .  */.  if( *pSi
1a620 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d  ze==1 ) *pSize =
1a630 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53   0;...  return S
1a640 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1a650 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1a660 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1a670 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1a680 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72  _)./*.** Handler
1a690 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69   for proxy-locki
1a6a0 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ng file-control 
1a6b0 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20  verbs.  Defined 
1a6c0 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20  below in the.** 
1a6d0 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67  proxying locking
1a6e0 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74   division..*/.st
1a6f0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69  atic int proxyFi
1a700 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1a710 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64  3_file*,int,void
1a720 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a  *);.#endif../* .
1a730 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1a740 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61   is called to ha
1a750 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f  ndle the SQLITE_
1a760 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
1a770 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  .** file-control
1a780 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
1a790 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
1a7a0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
1a7b0 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
1a7c0 69 73 20 66 69 6c 65 2c 20 69 74 20 63 6f 75 6c  is file, it coul
1a7d0 64 20 62 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  d be.** that the
1a7e0 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
1a7f0 65 20 65 78 74 65 6e 64 65 64 20 61 74 20 74 68  e extended at th
1a800 69 73 20 70 6f 69 6e 74 2e 20 4f 74 68 65 72 77  is point. Otherw
1a810 69 73 65 2c 20 74 68 65 0a 2a 2a 20 53 51 4c 49  ise, the.** SQLI
1a820 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
1a830 4e 54 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  NT operation is 
1a840 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 55 6e 69 78  a no-op for Unix
1a850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a860 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e  fcntlSizeHint(un
1a870 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
1a880 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28  64 nByte){.  if(
1a890 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1a8a0 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65  ){.    i64 nSize
1a8b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a8c0 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64       /* Required
1a8d0 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
1a8e0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1a8f0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1a900 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20  /* Used to hold 
1a910 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66  return values of
1a920 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a   fstat() */.   .
1a930 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
1a940 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20  pFile->h, &buf) 
1a950 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1a960 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20  IOERR_FSTAT;..  
1a970 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74    nSize = ((nByt
1a980 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  e+pFile->szChunk
1a990 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43  -1) / pFile->szC
1a9a0 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1a9b0 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20  zChunk;.    if( 
1a9c0 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73  nSize>(i64)buf.s
1a9d0 74 5f 73 69 7a 65 20 29 7b 0a 23 69 66 20 64 65  t_size ){.#if de
1a9e0 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58  fined(HAVE_POSIX
1a9f0 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48  _FALLOCATE) && H
1aa00 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1aa10 41 54 45 0a 20 20 20 20 20 20 69 6e 74 20 72 63  ATE.      int rc
1aa20 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
1aa30 20 20 20 20 72 63 20 3d 20 6f 73 46 61 6c 6c 6f      rc = osFallo
1aa40 63 61 74 65 28 70 46 69 6c 65 2d 3e 2e 68 2c 20  cate(pFile->.h, 
1aa50 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69  buf.st_size, nSi
1aa60 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a  ze-buf.st_size;.
1aa70 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63        }while( rc
1aa80 3c 30 20 26 26 20 65 72 72 6e 6f 3d 45 49 4e 54  <0 && errno=EINT
1aa90 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  R );.      if( r
1aaa0 63 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  c ) return SQLIT
1aab0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23  E_IOERR_WRITE;.#
1aac0 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66  else.      /* If
1aad0 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74   the OS does not
1aae0 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c   have posix_fall
1aaf0 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74  ocate(), fake it
1ab00 2e 20 46 69 72 73 74 20 75 73 65 0a 20 20 20 20  . First use.    
1ab10 20 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29    ** ftruncate()
1ab20 20 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65   to set the file
1ab30 20 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74   size, then writ
1ab40 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  e a single byte 
1ab50 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
1ab60 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63  last byte in eac
1ab70 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74  h block within t
1ab80 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69  he extended regi
1ab90 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a  on. This.      *
1aba0 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 74 65  * is the same te
1abb0 63 68 6e 69 71 75 65 20 75 73 65 64 20 62 79 20  chnique used by 
1abc0 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65  glibc to impleme
1abd0 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  nt posix_falloca
1abe0 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  te().      ** on
1abf0 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f   systems that do
1ac00 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c   not have a real
1ac10 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73   fallocate() sys
1ac20 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20  tem call..      
1ac30 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c  */.      int nBl
1ac40 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69  k = buf.st_blksi
1ac50 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73  ze;  /* File-sys
1ac60 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a  tem block size *
1ac70 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69  /.      i64 iWri
1ac80 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1ac90 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73      /* Next offs
1aca0 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  et to write to *
1acb0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69  /.      int nWri
1acc0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1acd0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
1ace0 6c 75 65 20 66 72 6f 6d 20 73 65 65 6b 41 6e 64  lue from seekAnd
1acf0 57 72 69 74 65 28 29 20 2a 2f 0a 0a 20 20 20 20  Write() */..    
1ad00 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1ad10 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1ad20 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20   nSize) ){.     
1ad30 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1ad40 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1ad50 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
1ad60 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1ad70 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1ad80 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1ad90 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1ada0 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65    }.      iWrite
1adb0 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65   = ((buf.st_size
1adc0 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e   + 2*nBlk - 1)/n
1add0 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20  Blk)*nBlk-1;.   
1ade0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
1adf0 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64  nWrite = seekAnd
1ae00 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72  Write(pFile, iWr
1ae10 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20  ite, "", 1);.   
1ae20 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e       iWrite += n
1ae30 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 20 77 68 69  Blk;.      } whi
1ae40 6c 65 28 20 6e 57 72 69 74 65 3d 3d 31 20 26 26  le( nWrite==1 &&
1ae50 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 3b   iWrite<nSize );
1ae60 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74  .      if( nWrit
1ae70 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  e!=1 ) return SQ
1ae80 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1ae90 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
1aea0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1aeb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1aec0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64   Information and
1aed0 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f   control of an o
1aee0 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
1aef0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1af00 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  nixFileControl(s
1af10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1af20 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
1af30 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
1af40 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
1af50 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
1af60 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
1af70 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75  (int*)pArg = ((u
1af80 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 65 46  nixFile*)id)->eF
1af90 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72  ileLock;.      r
1afa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1afb0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1afc0 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e  SQLITE_LAST_ERRN
1afd0 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
1afe0 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46  *)pArg = ((unixF
1aff0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
1b000 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
1b010 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1b020 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1b030 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
1b040 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 28 28 75  IZE: {.      ((u
1b050 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 73 7a  nixFile*)id)->sz
1b060 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29  Chunk = *(int *)
1b070 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75  pArg;.      retu
1b080 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b090 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1b0a0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
1b0b0 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  INT: {.      ret
1b0c0 75 72 6e 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e  urn fcntlSizeHin
1b0d0 74 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  t((unixFile *)id
1b0e0 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b  , *(i64 *)pArg);
1b0f0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
1b100 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65  DEBUG.    /* The
1b110 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69   pager calls thi
1b120 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e  s method to sign
1b130 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20 64  al that it has d
1b140 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c  one.    ** a rol
1b150 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74  lback and that t
1b160 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74  he database is t
1b170 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67  herefore unchang
1b180 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74  ed and.    ** it
1b190 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20   hence it is OK 
1b1a0 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  for the transact
1b1b0 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ion change count
1b1c0 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  er to be.    ** 
1b1d0 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a  unchanged..    *
1b1e0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1b1f0 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1b200 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28  NGED: {.      ((
1b210 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64  unixFile*)id)->d
1b220 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
1b230 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b240 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  _OK;.    }.#endi
1b250 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1b260 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1b270 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1b280 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65  PPLE__).    case
1b290 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
1b2a0 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63  PROXYFILE:.    c
1b2b0 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  ase SQLITE_GET_L
1b2c0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a  OCKPROXYFILE: {.
1b2d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f        return pro
1b2e0 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64  xyFileControl(id
1b2f0 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d  ,op,pArg);.    }
1b300 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1b310 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1b320 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1b330 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a  d(__APPLE__) */.
1b340 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b350 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54  FCNTL_SYNC_OMITT
1b360 45 44 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ED: {.      retu
1b370 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
1b380 2a 20 41 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20  * A no-op */.   
1b390 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1b3a0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
1b3b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b3c0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1b3d0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
1b3e0 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
1b3f0 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
1b400 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1b410 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
1b420 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
1b430 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
1b440 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
1b450 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
1b460 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
1b470 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
1b480 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
1b490 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
1b4a0 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
1b4b0 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
1b4c0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
1b4d0 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
1b4e0 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
1b4f0 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
1b500 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
1b510 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
1b520 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
1b530 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
1b540 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1b550 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
1b560 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
1b570 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
1b580 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1b590 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1b5a0 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
1b5b0 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  R_SIZE;.}../*.**
1b5c0 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
1b5d0 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
1b5e0 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  cs for the file.
1b5f0 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
1b600 30 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73  0 for unix..*/.s
1b610 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
1b620 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1b630 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
1b640 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
1b650 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1b660 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
1b670 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 0;.}..#ifndef 
1b680 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1b690 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
1b6a0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
1b6b0 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   an shared memor
1b6c0 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a  y buffer.  .**.*
1b6d0 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  * When multiple 
1b6e0 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65  threads all refe
1b6f0 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77  rence the same w
1b700 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74  al-index, each t
1b710 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73  hread.** has its
1b720 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a   own unixShm obj
1b730 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
1b740 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  l point to a sin
1b750 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20  gle instance.** 
1b760 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e  of this unixShmN
1b770 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20  ode object.  In 
1b780 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63  other words, eac
1b790 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f  h wal-index is o
1b7a0 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e  pened.** only on
1b7b0 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a  ce per process..
1b7c0 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53  **.** Each unixS
1b7d0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
1b7e0 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20   connected to a 
1b7f0 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65  single unixInode
1b800 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20  Info object..** 
1b810 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63  We could coalesc
1b820 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e  e this object in
1b830 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  to unixInodeInfo
1b840 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64  , but that would
1b850 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f   mean.** every o
1b860 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f  pen file that do
1b870 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65  es not use share
1b880 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68  d memory (in oth
1b890 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a  er words, most.*
1b8a0 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f  * open files) wo
1b8b0 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72 72  uld have to carr
1b8c0 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78  y around this ex
1b8d0 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  tra information.
1b8e0 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78    So.** the unix
1b8f0 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
1b900 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
1b910 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78  ter to this unix
1b920 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a  ShmNode object.*
1b930 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68  * and the unixSh
1b940 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
1b950 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65  created only whe
1b960 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  n needed..**.** 
1b970 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
1b980 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65  must be true whe
1b990 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65  n creating or de
1b9a0 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73  stroying.** this
1b9b0 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65   object or while
1b9c0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
1b9d0 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
1b9e0 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  g fields:.**.** 
1b9f0 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20       nRef.**.** 
1ba00 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
1ba10 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e  elds are read-on
1ba20 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  ly after the obj
1ba30 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a  ect is created:.
1ba40 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a  ** .**      fid.
1ba50 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  **      zFilenam
1ba60 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75  e.**.** Either u
1ba70 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78  nixShmNode.mutex
1ba80 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72   must be held or
1ba90 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
1baa0 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78  f==0 and.** unix
1bab0 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74  MutexHeld() is t
1bac0 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67  rue when reading
1bad0 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20   or writing any 
1bae0 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69  other field.** i
1baf0 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
1bb00 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
1bb10 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78  ShmNode {.  unix
1bb20 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
1bb30 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e  e;     /* unixIn
1bb40 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e  odeInfo that own
1bb50 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20  s this SHM node 
1bb60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
1bb70 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20  ex *mutex;      
1bb80 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65  /* Mutex to acce
1bb90 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  ss this object *
1bba0 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
1bbb0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
1bbc0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d  * Name of the mm
1bbd0 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
1bbe0 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
1bbf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
1bc00 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
1bc10 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  or */.  int szRe
1bc20 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
1bc30 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68     /* Size of sh
1bc40 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1bc50 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
1bc60 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
1bc70 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
1bc80 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f  rray apRegion */
1bc90 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69  .  char **apRegi
1bca0 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
1bcb0 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64   Array of mapped
1bcc0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1bcd0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
1bce0 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
1bcf0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1bd00 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65   of unixShm obje
1bd10 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
1bd20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  this */.  unixSh
1bd30 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
1bd40 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78       /* All unix
1bd50 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
1bd60 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
1bd70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1bd80 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73  BUG.  u8 exclMas
1bd90 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1bda0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
1bdb0 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
1bdc0 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d   */.  u8 sharedM
1bdd0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1bde0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
1bdf0 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
1be00 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
1be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1be20 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
1be30 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65  unixShm.id value
1be40 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
1be50 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
1be60 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
1be70 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
1be80 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
1be90 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
1bea0 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
1beb0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
1bec0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
1bed0 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
1bee0 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
1bef0 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
1bf00 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
1bf10 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
1bf20 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  *.**    unixShm.
1bf30 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78  pFile.**    unix
1bf40 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
1bf50 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
1bf60 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
1bf70 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65  he unixShm.pFile
1bf80 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
1bf90 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
1bfa0 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
1bfb0 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
1bfc0 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
1bfd0 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65   {.  unixShmNode
1bfe0 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
1bff0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1c000 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  g unixShmNode ob
1c010 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ject */.  unixSh
1c020 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
1c030 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69       /* Next uni
1c040 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  xShm with the sa
1c050 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  me unixShmNode *
1c060 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c080 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
1c090 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  g the unixShmNod
1c0a0 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36  e mutex */.  u16
1c0b0 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
1c0c0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1c0d0 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
1c0e0 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78  held */.  u16 ex
1c0f0 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
1c100 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1c110 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1c120 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53  held */.#ifdef S
1c130 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
1c140 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   id;            
1c150 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f           /* Id o
1c160 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
1c170 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69  n within its uni
1c180 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64  xShmNode */.#end
1c190 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  if.};../*.** Con
1c1a0 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
1c1b0 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
1c1c0 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  ne UNIX_SHM_BASE
1c1d0 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53     ((22+SQLITE_S
1c1e0 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20  HM_NLOCK)*4)    
1c1f0 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f       /* first lo
1c200 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
1c210 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20  ne UNIX_SHM_DMS 
1c220 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53     (UNIX_SHM_BAS
1c230 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
1c240 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
1c250 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
1c260 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76   Apply posix adv
1c270 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
1c280 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f  all bytes from o
1c290 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74  fst through ofst
1c2a0 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b  +n-1..**.** Lock
1c2b0 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d  s block if the m
1c2c0 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55  ask is exactly U
1c2d0 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72  NIX_SHM_C and ar
1c2e0 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a  e non-blocking.*
1c2f0 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  * otherwise..*/.
1c300 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1c310 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
1c320 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
1c330 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20  mNode, /* Apply 
1c340 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
1c350 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
1c360 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
1c370 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
1c380 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
1c390 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
1c3a0 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
1c3b0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1c3c0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
1c3d0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  f the locking ra
1c3e0 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  nge */.  int n  
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c400 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1c410 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  es to lock */.){
1c420 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
1c430 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  f;       /* The 
1c440 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
1c450 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
1c460 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1c470 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52  QLITE_OK;   /* R
1c480 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
1c490 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a  fcntl() */..  /*
1c4a0 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
1c4b0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1c4c0 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
1c4d0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
1c4e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c4f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53  e3_mutex_held(pS
1c500 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c  hmNode->mutex) |
1c510 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  | pShmNode->nRef
1c520 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61  ==0 );..  /* Sha
1c530 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20  red locks never 
1c540 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  span more than o
1c550 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73  ne byte */.  ass
1c560 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63  ert( n==1 || loc
1c570 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29  kType!=F_RDLCK )
1c580 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72  ;..  /* Locks ar
1c590 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a  e within range *
1c5a0 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  /.  assert( n>=1
1c5b0 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d   && n<SQLITE_SHM
1c5c0 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  _NLOCK );..  /* 
1c5d0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
1c5e0 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
1c5f0 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 66  s */.  memset(&f
1c600 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b  , 0, sizeof(f));
1c610 0a 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f  .  f.l_type = lo
1c620 63 6b 54 79 70 65 3b 0a 20 20 66 2e 6c 5f 77 68  ckType;.  f.l_wh
1c630 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
1c640 0a 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f  .  f.l_start = o
1c650 66 73 74 3b 0a 20 20 66 2e 6c 5f 6c 65 6e 20 3d  fst;.  f.l_len =
1c660 20 6e 3b 0a 0a 20 20 72 63 20 3d 20 6f 73 46 63   n;..  rc = osFc
1c670 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ntl(pShmNode->h,
1c680 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20   F_SETLK, &f);. 
1c690 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29   rc = (rc!=(-1))
1c6a0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
1c6b0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 0a 20 20 2f  QLITE_BUSY;..  /
1c6c0 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f  * Update the glo
1c6d0 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61  bal lock state a
1c6e0 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63  nd do debug trac
1c6f0 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
1c700 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75  LITE_DEBUG.  { u
1c710 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41  16 mask;.  OSTRA
1c720 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29  CE(("SHM-LOCK ")
1c730 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  );.  mask = (1<<
1c740 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
1c750 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  ofst);.  if( rc=
1c760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c770 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
1c780 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
1c790 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
1c7a0 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
1c7b0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1c7c0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
1c7d0 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
1c7e0 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
1c7f0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65  &= ~mask;.    }e
1c800 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
1c810 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
1c820 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
1c830 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  d-lock %d ok", o
1c840 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
1c850 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
1c860 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
1c870 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
1c880 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1c890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1c8a0 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
1c8b0 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
1c8c0 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
1c8d0 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  e-lock %d ok", o
1c8e0 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
1c8f0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
1c900 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
1c910 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
1c920 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1c930 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1c940 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
1c950 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
1c960 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
1c970 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
1c980 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t));.    }else i
1c990 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
1c9a0 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
1c9b0 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
1c9c0 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  k failed"));.   
1c9d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1c9e0 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
1c9f0 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
1ca00 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
1ca10 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  -lock %d failed"
1ca20 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a  , ofst));.    }.
1ca30 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
1ca40 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 30   - afterwards %0
1ca50 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
1ca60 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1ca70 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68  >sharedMask, pSh
1ca80 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29  mNode->exclMask)
1ca90 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1caa0 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20   return rc;     
1cab0 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75     .}.../*.** Pu
1cac0 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  rge the unixShmN
1cad0 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
1cae0 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
1caf0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
1cb00 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
1cb10 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
1cb20 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
1cb30 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
1cb40 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
1cb50 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
1cb60 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
1cb70 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
1cb80 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65  oid unixShmPurge
1cb90 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
1cba0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
1cbb0 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d  p = pFd->pInode-
1cbc0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
1cbd0 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
1cbe0 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ld() );.  if( p 
1cbf0 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  && p->nRef==0 ){
1cc00 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1cc10 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64  assert( p->pInod
1cc20 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29  e==pFd->pInode )
1cc30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74  ;.    if( p->mut
1cc40 65 78 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex ) sqlite3_mut
1cc50 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78  ex_free(p->mutex
1cc60 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1cc70 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b  i<p->nRegion; i+
1cc80 2b 29 7b 0a 20 20 20 20 20 20 6d 75 6e 6d 61 70  +){.      munmap
1cc90 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c  (p->apRegion[i],
1cca0 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   p->szRegion);. 
1ccb0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1ccc0 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
1ccd0 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68  n);.    if( p->h
1cce0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62  >=0 ){.      rob
1ccf0 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70  ust_close(pFd, p
1cd00 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
1cd10 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b        p->h = -1;
1cd20 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49  .    }.    p->pI
1cd30 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
1cd40 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
1cd50 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
1cd60 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
1cd70 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
1cd80 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1cd90 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
1cda0 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
1cdb0 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
1cdc0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
1cdd0 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
1cde0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
1cdf0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
1ce00 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
1ce10 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
1ce20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
1ce30 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1ce40 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
1ce50 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
1ce60 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1ce70 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
1ce80 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
1ce90 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
1cea0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
1ceb0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
1cec0 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
1ced0 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
1cee0 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
1cef0 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
1cf00 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
1cf10 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
1cf20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
1cf30 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
1cf40 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
1cf50 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
1cf60 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
1cf70 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
1cf80 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
1cf90 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
1cfa0 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
1cfb0 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
1cfc0 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
1cfd0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
1cfe0 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
1cff0 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
1d000 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
1d010 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
1d020 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
1d030 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
1d040 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
1d050 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
1d060 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
1d070 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
1d080 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
1d090 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
1d0a0 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
1d0b0 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
1d0c0 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
1d0d0 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
1d0e0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1d0f0 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
1d100 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
1d110 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
1d120 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
1d130 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
1d140 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
1d150 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
1d160 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
1d170 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
1d180 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
1d190 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
1d1a0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
1d1b0 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
1d1c0 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
1d1d0 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
1d1e0 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
1d1f0 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
1d200 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
1d210 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1d220 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
1d230 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
1d240 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
1d250 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
1d260 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
1d270 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
1d280 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
1d290 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
1d2a0 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
1d2b0 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
1d2c0 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
1d2d0 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
1d2e0 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
1d2f0 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
1d300 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
1d310 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
1d320 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
1d330 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
1d340 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
1d350 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
1d360 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
1d370 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
1d380 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
1d390 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
1d3a0 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
1d3b0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
1d3c0 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
1d3d0 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
1d3e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1d3f0 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  t unixOpenShared
1d400 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20  Memory(unixFile 
1d410 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63  *pDbFd){.  struc
1d420 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30  t unixShm *p = 0
1d430 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
1d440 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1d450 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
1d460 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
1d470 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f  e *pShmNode;   /
1d480 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1d490 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
1d4a0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4c0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1d4d0 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
1d4e0 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
1d4f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1d500 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63  ode of fd */.  c
1d510 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d  har *zShmFilenam
1d520 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
1d530 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
1d540 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20  le used for SHM 
1d550 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c  */.  int nShmFil
1d560 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
1d570 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1d580 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65  the SHM filename
1d590 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
1d5a0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
1d5b0 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e  e for the new un
1d5c0 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f  ixShm object. */
1d5d0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
1d5e0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
1d5f0 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
1d600 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1d610 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28  NOMEM;.  memset(
1d620 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
1d630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
1d640 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a  Fd->pShm==0 );..
1d650 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1d660 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f  e if a unixShmNo
1d670 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64  de object alread
1d680 79 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20  y exists. Reuse 
1d690 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
1d6a0 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e   one if present.
1d6b0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
1d6c0 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
1d6d0 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
1d6e0 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
1d6f0 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
1d700 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  e;.  pShmNode = 
1d710 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
1d720 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
1d730 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
1d740 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d760 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f   fstat() info fo
1d770 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
1d780 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  */..    /* Call 
1d790 66 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72  fstat() to figur
1d7a0 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73  e out the permis
1d7b0 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74  sions on the dat
1d7c0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20  abase file. If. 
1d7d0 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68     ** a new *-sh
1d7e0 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  m file is create
1d7f0 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69  d, an attempt wi
1d800 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72  ll be made to cr
1d810 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77  eate it.    ** w
1d820 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72  ith the same per
1d830 6d 69 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63  missions. The ac
1d840 74 75 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73  tual permissions
1d850 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 72 65   the file is cre
1d860 61 74 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68  ated.    ** with
1d870 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20   are subject to 
1d880 74 68 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73  the current umas
1d890 6b 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a  k setting..    *
1d8a0 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61  /.    if( osFsta
1d8b0 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74  t(pDbFd->h, &sSt
1d8c0 61 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  at) ){.      rc 
1d8d0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  = SQLITE_IOERR_F
1d8e0 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  STAT;.      goto
1d8f0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1d900 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
1d910 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
1d920 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  Y.    nShmFilena
1d930 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49  me = sizeof(SQLI
1d940 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1d950 29 20 2b 20 33 30 3b 0a 23 65 6c 73 65 0a 20 20  ) + 30;.#else.  
1d960 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    nShmFilename =
1d970 20 35 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e   5 + (int)strlen
1d980 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  (pDbFd->zPath);.
1d990 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
1d9a0 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
1d9b0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53  lloc( sizeof(*pS
1d9c0 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69  hmNode) + nShmFi
1d9d0 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66  lename );.    if
1d9e0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
1d9f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1da00 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1da10 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1da20 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  r;.    }.    mem
1da30 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c  set(pShmNode, 0,
1da40 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
1da50 65 29 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c  e));.    zShmFil
1da60 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65  ename = pShmNode
1da70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
1da80 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31  har*)&pShmNode[1
1da90 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
1daa0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
1dab0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1dac0 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
1dad0 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
1dae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1daf0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d        SQLITE_SHM
1db00 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c  _DIRECTORY "/sql
1db10 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a  ite-shm-%x-%x",.
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 20 20 20 20 20 28 75 33 32 29 73 53 74 61 74 2e       (u32)sStat.
1db40 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74  st_ino, (u32)sSt
1db50 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73  at.st_dev);.#els
1db60 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  e.    sqlite3_sn
1db70 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e  printf(nShmFilen
1db80 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ame, zShmFilenam
1db90 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62  e, "%s-shm", pDb
1dba0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64  Fd->zPath);.#end
1dbb0 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  if.    pShmNode-
1dbc0 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62  >h = -1;.    pDb
1dbd0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
1dbe0 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
1dbf0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
1dc00 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
1dc10 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  Inode;.    pShmN
1dc20 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
1dc30 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
1dc40 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
1dc50 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
1dc60 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
1dc70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1dc80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1dc90 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1dca0 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
1dcb0 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f  pShmNode->h = ro
1dcc0 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69  bust_open(zShmFi
1dcd0 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f  lename, O_RDWR|O
1dce0 5f 43 52 45 41 54 2c 0a 20 20 20 20 20 20 20 20  _CREAT,.        
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd00 20 20 20 20 20 28 73 53 74 61 74 2e 73 74 5f 6d       (sStat.st_m
1dd10 6f 64 65 20 26 20 30 37 37 37 29 29 3b 0a 20 20  ode & 0777));.  
1dd20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1dd30 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  h<0 ){.      rc 
1dd40 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
1dd50 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
1dd60 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68  KPT, "open", zSh
1dd70 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
1dd80 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1dd90 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
1dda0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1ddb0 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
1ddc0 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
1ddd0 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
1dde0 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74  h..    ** If not
1ddf0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  , truncate the f
1de00 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ile to zero leng
1de10 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  th. .    */.    
1de20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1de30 20 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53      if( unixShmS
1de40 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1de50 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49  de, F_WRLCK, UNI
1de60 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53  X_SHM_DMS, 1)==S
1de70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1de80 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1de90 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
1dea0 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  >h, 0) ){.      
1deb0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
1dec0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1ded0 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e  _SHMOPEN, "ftrun
1dee0 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e  cate", zShmFilen
1def0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1df00 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1df10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1df20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
1df30 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1df40 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49  de, F_RDLCK, UNI
1df50 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  X_SHM_DMS, 1);. 
1df60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
1df70 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
1df80 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  err;.  }..  /* M
1df90 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
1dfa0 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
1dfb0 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  f the unixShmNod
1dfc0 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f  e */.  p->pShmNo
1dfd0 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23  de = pShmNode;.#
1dfe0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1dff0 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
1e000 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
1e010 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
1e020 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
1e030 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
1e040 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
1e050 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
1e060 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1e070 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
1e080 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
1e090 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
1e0a0 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
1e0b0 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
1e0c0 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
1e0d0 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
1e0e0 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
1e0f0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f  truct unixShm) o
1e100 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
1e110 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
1e120 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
1e130 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
1e140 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
1e150 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
1e160 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
1e170 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
1e180 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1e190 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
1e1a0 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
1e1b0 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
1e1c0 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
1e1d0 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
1e1e0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1e1f0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1e200 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
1e210 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
1e220 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1e230 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
1e240 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1e250 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1e260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e270 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
1e280 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
1e290 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
1e2a0 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  .  unixShmPurge(
1e2b0 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a  pDbFd);       /*
1e2c0 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
1e2d0 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
1e2e0 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
1e2f0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e  e3_free(p);.  un
1e300 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1e310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e320 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1e330 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1e340 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
1e350 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
1e360 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
1e370 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
1e380 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1e390 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1e3a0 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
1e3b0 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
1e3c0 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
1e3d0 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
1e3e0 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
1e3f0 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
1e400 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
1e410 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
1e420 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1e430 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1e440 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1e450 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
1e460 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
1e470 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65  se, if the bExte
1e480 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1e490 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
1e4a0 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
1e4b0 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
1e4c0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
1e4d0 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
1e4e0 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
1e4f0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
1e500 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
1e510 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
1e520 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
1e530 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1e540 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65  ed. If .** bExte
1e550 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  nd is non-zero a
1e560 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
1e570 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1e580 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
1e590 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
1e5a0 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
1e5b0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
1e5c0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
1e5d0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
1e5e0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
1e5f0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
1e600 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
1e610 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
1e620 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
1e630 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
1e640 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
1e650 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
1e660 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
1e670 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1e680 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
1e690 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1e6a0 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
1e6b0 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
1e6c0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
1e6d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e6e0 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
1e6f0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
1e700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1e710 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
1e720 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
1e730 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e750 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
1e760 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
1e770 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
1e780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1e790 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
1e7a0 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20    int bExtend,  
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
1e7d0 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
1e7e0 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
1e7f0 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
1e800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1e810 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
1e820 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
1e830 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
1e840 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78  File*)fd;.  unix
1e850 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68  Shm *p;.  unixSh
1e860 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
1e870 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e880 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
1e890 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
1e8a0 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  y file has not y
1e8b0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
1e8c0 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
1e8d0 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68    if( pDbFd->pSh
1e8e0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  m==0 ){.    rc =
1e8f0 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
1e900 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
1e910 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e920 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1e930 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46  .  }..  p = pDbF
1e940 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e  d->pShm;.  pShmN
1e950 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1e960 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
1e970 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
1e980 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  e->mutex);.  ass
1e990 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
1e9a0 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
1e9b0 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
1e9c0 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20  Region==0 );..  
1e9d0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
1e9e0 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
1e9f0 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e  {.    char **apN
1ea00 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
1ea10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
1ea20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79  apRegion[] array
1ea30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
1ea40 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
1ea50 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
1ea60 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
1ea70 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1ea80 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
1ea90 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1eaa0 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73     /* Used by fs
1eab0 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53  tat() */..    pS
1eac0 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
1ead0 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20   = szRegion;..  
1eae0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1eaf0 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74  ed region is not
1eb00 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
1eb10 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
1eb20 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a  ess space..    *
1eb30 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1eb40 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
1eb50 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
1eb60 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
1eb70 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61  ile is.    ** la
1eb80 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  rge enough to co
1eb90 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73  ntain the reques
1eba0 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20  ted region)..   
1ebb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73   */.    if( osFs
1ebc0 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  tat(pShmNode->h,
1ebd0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
1ebe0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1ebf0 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20  ERR_SHMSIZE;.   
1ec00 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1ec10 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
1ec20 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  if( sStat.st_siz
1ec30 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  e<nByte ){.     
1ec40 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
1ec50 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1ec60 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
1ec70 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65  If bExtend is se
1ec80 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 61  t to.      ** fa
1ec90 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e  lse, exit early.
1eca0 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74   *pp will be set
1ecb0 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
1ecc0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1ecd0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1ece0 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79  ** Alternatively
1ecf0 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20  , if bExtend is 
1ed00 74 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e 63  true, use ftrunc
1ed10 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74  ate() to allocat
1ed20 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72  e.      ** the r
1ed30 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1ed40 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  region..      */
1ed50 0a 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74  .      if( !bExt
1ed60 65 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d 70 61  end ) goto shmpa
1ed70 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 69 66  ge_out;.      if
1ed80 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  ( robust_ftrunca
1ed90 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  te(pShmNode->h, 
1eda0 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20  nByte) ){.      
1edb0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
1edc0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1edd0 5f 53 48 4d 53 49 5a 45 2c 22 66 74 72 75 6e 63  _SHMSIZE,"ftrunc
1ede0 61 74 65 22 2c 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ate",pShmNode->z
1edf0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
1ee00 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1ee10 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
1ee20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
1ee30 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1ee40 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
1ee50 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
1ee60 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
1ee70 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68  .    apNew = (ch
1ee80 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65  ar **)sqlite3_re
1ee90 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
1eea0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
1eeb0 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73  n, (iRegion+1)*s
1eec0 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20  izeof(char *).  
1eed0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70    );.    if( !ap
1eee0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
1eef0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
1ef00 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
1ef10 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
1ef20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65    }.    pShmNode
1ef30 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e  ->apRegion = apN
1ef40 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70 53  ew;.    while(pS
1ef50 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
1ef60 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20  =iRegion){.     
1ef70 20 76 6f 69 64 20 2a 70 4d 65 6d 20 3d 20 6d 6d   void *pMem = mm
1ef80 61 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 20  ap(0, szRegion, 
1ef90 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57  PROT_READ|PROT_W
1efa0 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20  RITE, .         
1efb0 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68   MAP_SHARED, pSh
1efc0 6d 4e 6f 64 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f  mNode->h, pShmNo
1efd0 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65  de->nRegion*szRe
1efe0 67 69 6f 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20  gion.      );.  
1eff0 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41      if( pMem==MA
1f000 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
1f010 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f020 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 67  IOERR;.        g
1f030 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1f040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1f050 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
1f060 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
1f070 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20  ion] = pMem;.   
1f080 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
1f090 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gion++;.    }.  
1f0a0 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
1f0b0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1f0c0 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
1f0d0 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68  ){.    *pp = pSh
1f0e0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
1f0f0 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73  iRegion];.  }els
1f100 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
1f110 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1f120 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1f130 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
1f140 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f150 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63  * Change the loc
1f160 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68  k state for a sh
1f170 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
1f180 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ent..**.** Note 
1f190 74 68 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f  that the relatio
1f1a0 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 53 48  nship between SH
1f1b0 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49  AREd and EXCLUSI
1f1c0 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69  VE locks is a li
1f1d0 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e  ttle.** differen
1f1e0 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70  t here than in p
1f1f0 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f  osix.  In xShmLo
1f200 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f  ck(), one can go
1f210 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a   from unlocked.*
1f220 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20  * to shared and 
1f230 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c  back or from unl
1f240 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69  ocked to exclusi
1f250 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75  ve and back.  Bu
1f260 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74  t one may.** not
1f270 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20   go from shared 
1f280 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20  to exclusive or 
1f290 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74  from exclusive t
1f2a0 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61  o shared..*/.sta
1f2b0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c  tic int unixShmL
1f2c0 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
1f2d0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
1f2e0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
1f2f0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
1f300 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1f310 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
1f320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f330 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
1f340 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
1f350 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f370 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
1f380 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
1f390 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
1f3a0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
1f3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
1f3c0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
1f3d0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e   lock */.){.  un
1f3e0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
1f3f0 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20  (unixFile*)fd;  
1f400 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1f410 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
1f420 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69   memory */.  uni
1f430 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  xShm *p = pDbFd-
1f440 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
1f450 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
1f460 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
1f470 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68  cked */.  unixSh
1f480 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4a0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1f4b0 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
1f4c0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
1f4d0 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
1f4e0 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54  >pShmNode;  /* T
1f4f0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69  he underlying fi
1f500 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  le iNode */.  in
1f510 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f530 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1f540 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b  de */.  u16 mask
1f550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f570 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74   Mask of locks t
1f580 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73  o take or releas
1f590 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
1f5a0 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d  pShmNode==pDbFd-
1f5b0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1f5c0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1f5d0 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
1f5e0 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
1f5f0 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ;.  assert( ofst
1f600 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
1f610 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
1f620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
1f630 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
1f640 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1f650 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
1f660 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
1f670 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
1f680 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
1f690 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1f6a0 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
1f6b0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1f6c0 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
1f6d0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
1f6e0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
1f6f0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
1f700 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1f710 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
1f720 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
1f730 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1f740 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
1f750 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
1f760 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
1f770 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65  1<<ofst);.  asse
1f780 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
1f790 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
1f7a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f7b0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1f7c0 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
1f7d0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
1f7e0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
1f7f0 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
1f800 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
1f810 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
1f820 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
1f830 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
1f840 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
1f850 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
1f860 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
1f870 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
1f880 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1f890 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
1f8a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f8b0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
1f8c0 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
1f8d0 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
1f8e0 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
1f8f0 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
1f900 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
1f910 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
1f920 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
1f930 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
1f940 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
1f950 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
1f960 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1f970 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b  ShmNode, F_UNLCK
1f980 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
1f990 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  BASE, n);.    }e
1f9a0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1f9b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1f9c0 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68  ..    /* Undo th
1f9d0 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f  e local locks */
1f9e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1f9f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fa00 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  p->exclMask &= ~
1fa10 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73  mask;.      p->s
1fa20 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
1fa30 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c  sk;.    } .  }el
1fa40 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
1fa50 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
1fa60 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
1fa70 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
1fa80 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
1fa90 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
1faa0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
1fab0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
1fac0 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
1fad0 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
1fae0 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
1faf0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
1fb00 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
1fb10 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
1fb20 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
1fb30 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
1fb40 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
1fb50 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
1fb60 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
1fb70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1fb80 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1fb90 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1fba0 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1fbb0 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
1fbc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1fbd0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
1fbe0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1fbf0 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
1fc00 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
1fc10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1fc20 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
1fc30 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
1fc40 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
1fc50 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
1fc60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fc70 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
1fc80 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
1fc90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
1fca0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
1fcb0 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43  pShmNode, F_RDLC
1fcc0 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
1fcd0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
1fce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fcf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1fd00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1fd10 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f     /* Get the lo
1fd20 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cal shared locks
1fd30 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1fd40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fd50 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
1fd60 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a   |= mask;.    }.
1fd70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1fd80 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
1fd90 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
1fda0 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
1fdb0 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
1fdc0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  .    ** lock.  I
1fdd0 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
1fde0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
1fdf0 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a  ht away..    */.
1fe00 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
1fe10 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
1fe20 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
1fe30 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
1fe40 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
1fe50 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65  =0 || (pX->share
1fe60 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  dMask & mask)!=0
1fe70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1fe80 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1fe90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fea0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1feb0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
1fec0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
1fed0 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
1fee0 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
1fef0 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
1ff00 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
1ff10 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
1ff20 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
1ff30 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1ff40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ff50 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
1ff60 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1ff70 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73  de, F_WRLCK, ofs
1ff80 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
1ff90 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
1ffa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ffb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ffc0 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
1ffd0 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
1ffe0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
1fff0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
20000 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
20010 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
20020 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
20030 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
20040 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
20050 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
20060 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
20070 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65         p->id, ge
20080 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72 65  tpid(), p->share
20090 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
200a0 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sk));.  return r
200b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
200c0 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
200d0 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
200e0 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
200f0 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a   memory.  .**.**
20100 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
20110 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
20120 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
20130 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
20140 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
20150 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
20160 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
20170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20180 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28   unixShmBarrier(
20190 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
201a0 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20  *fd             
201b0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
201c0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
201d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
201e0 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
201f0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e  AMETER(fd);.  un
20200 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
20210 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
20220 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ();.}../*.** Clo
20230 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
20240 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
20250 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
20260 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f  derlying .** sto
20270 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
20280 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
20290 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
202a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
202b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
202c0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  he connection th
202d0 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
202e0 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
202f0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
20300 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d  c int unixShmUnm
20310 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
20320 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
20330 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
20340 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
20350 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64   file */.  int d
20360 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
20370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
20380 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f  lete shared-memo
20390 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ry if true */.){
203a0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20  .  unixShm *p;  
203b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203c0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
203d0 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
203e0 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  d */.  unixShmNo
203f0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
20400 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
20410 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
20420 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
20430 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20   unixShm **pp;  
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20450 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
20460 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
20470 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e  nections */.  un
20480 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20  ixFile *pDbFd;  
20490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
204a0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
204b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
204c0 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69  ..  pDbFd = (uni
204d0 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  xFile*)fd;.  p =
204e0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
204f0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
20500 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
20510 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
20520 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74  mNode;..  assert
20530 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
20540 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
20550 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
20560 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
20570 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
20580 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65   );..  /* Remove
20590 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
205a0 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
205b0 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
205c0 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
205d0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
205e0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
205f0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
20600 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
20610 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
20620 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
20630 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
20640 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
20650 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
20660 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
20670 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
20680 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
20690 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
206a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
206b0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
206c0 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
206d0 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
206e0 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
206f0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
20700 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
20710 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
20720 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
20730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
20740 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
20750 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
20760 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
20770 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
20780 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
20790 61 67 20 29 20 75 6e 6c 69 6e 6b 28 70 53 68 6d  ag ) unlink(pShm
207a0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
207b0 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72  ;.    unixShmPur
207c0 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20  ge(pDbFd);.  }. 
207d0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
207e0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
207f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73  ITE_OK;.}...#els
20800 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  e.# define unixS
20810 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
20820 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  fine unixShmLock
20830 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
20840 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a  nixShmBarrier 0.
20850 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
20860 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
20870 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
20880 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
20890 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
208a0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
208b0 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
208c0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
208d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
208e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
208f0 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
20900 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
20910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20920 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
20930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20970 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64  */../*.** This d
20980 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
20990 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20   definitions of 
209a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
209b0 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a  ds objects that.
209c0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72  ** implement var
209d0 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  ious file lockin
209e0 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49  g strategies.  I
209f0 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  t also contains 
20a00 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f  definitions.** o
20a10 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  f "finder" funct
20a20 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d  ions.  A finder-
20a30 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
20a40 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61   to locate the a
20a50 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71  ppropriate.** sq
20a60 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
20a70 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61   object for a pa
20a80 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
20a90 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70  e file.  The pAp
20aa0 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f  pData.** field o
20ab0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  f the sqlite3_vf
20ac0 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72  s VFS objects ar
20ad0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
20ae0 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a   be pointers to.
20af0 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  ** the correct f
20b00 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66  inder-function f
20b10 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a  or that VFS..**.
20b20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66  ** Most finder f
20b30 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
20b40 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
20b50 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ixed sqlite3_io_
20b60 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
20b70 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74  t.  The only int
20b80 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d  eresting finder-
20b90 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f  function is auto
20ba0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68  lockIoFinder, wh
20bb0 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20  ich.** looks at 
20bc0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
20bd0 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ype and tries to
20be0 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20   guess the best 
20bf0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74  locking.** strat
20c00 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a  egy from that..*
20c10 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d  *.** For finder-
20c20 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f  funtion F, two o
20c30 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
20c40 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ed:.**.**    (1)
20c50 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72   The real finder
20c60 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20  -function named 
20c70 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a  "FImpt()"..**.**
20c80 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61      (2) A consta
20c90 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  nt pointer to th
20ca0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  is function name
20cb0 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a  d just "F"..**.*
20cc0 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
20cd0 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20  o the F pointer 
20ce0 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70  is used as the p
20cf0 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f  AppData value fo
20d00 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73  r VFS.** objects
20d10 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
20d20 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66   this instead of
20d30 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74   letting pAppDat
20d40 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63  a point.** direc
20d50 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65  tly at the finde
20d60 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65  r-function since
20d70 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65   C90 rules preve
20d80 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72  nt a void*.** fr
20d90 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20  om be cast into 
20da0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
20db0 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63  er..**.**.** Eac
20dc0 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
20dd0 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74  is macro generat
20de0 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a  es two objects:.
20df0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e  **.**   *  A con
20e00 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  stant sqlite3_io
20e10 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
20e20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74  call METHOD that
20e30 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   has locking.** 
20e40 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f       methods CLO
20e50 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
20e60 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a  , CKRESLOCK..**.
20e70 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d  **   *  An I/O m
20e80 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
20e90 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e  ction called FIN
20ea0 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73  DER that returns
20eb0 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20   a pointer.**   
20ec0 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44     to the METHOD
20ed0 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70   object in the p
20ee0 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a  revious bullet..
20ef0 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54  */.#define IOMET
20f00 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54  HODS(FINDER, MET
20f10 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c  HOD, VERSION, CL
20f20 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43  OSE, LOCK, UNLOC
20f30 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20  K, CKLOCK)      
20f40 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
20f50 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
20f60 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20  s METHOD = {    
20f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
20f90 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20  .   VERSION,    
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fb0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
20fe0 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20     CLOSE,       
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21000 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20  * xClose */     
21010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
21030 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20    unixRead,     
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21050 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20   xRead */       
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21070 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
21080 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20   unixWrite,     
21090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
210a0 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20  xWrite */       
210b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210c0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
210d0 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20  unixTruncate,   
210e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
210f0 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20  Truncate */     
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
21120 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20  nixSync,        
21130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
21140 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ync */          
21150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21160 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
21170 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  ixFileSize,     
21180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
21190 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  leSize */       
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43          \.   LOC
211c0 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
211d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
211e0 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21200 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f         \.   UNLO
21210 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
21220 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
21230 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
21240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21250 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43        \.   CKLOC
21260 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
21270 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
21280 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20  ReservedLock */ 
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212a0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
212b0 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
212c0 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
212d0 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20  ntrol */        
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212f0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63      \.   unixSec
21300 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
21310 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
21320 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21340 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69     \.   unixDevi
21350 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
21360 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61  s,  /* xDeviceCa
21370 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20  pabilities */   
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61    \.   unixShmMa
213a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
213b0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213e0 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63   \.   unixShmLoc
213f0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
21400 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21430 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72  \.   unixShmBarr
21440 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
21450 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
21460 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21480 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  .   unixShmUnmap
21490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214a0 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20  /* xShmUnmap */ 
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
214d0 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
21520 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
21530 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
21540 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e  FINDER##Impl(con
21550 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78  st char *z, unix
21560 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20  File *p){   \.  
21570 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
21580 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41  (z); UNUSED_PARA
21590 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
215a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72             \.  r
215c0 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20  eturn &METHOD;  
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21600 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20            \.}   
21610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21650 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
21660 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
21670 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f  io_methods *(*co
21680 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73  nst FINDER)(cons
21690 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
216a0 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20   *p)    \.    = 
216b0 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f  FINDER##Impl;../
216c0 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c  *.** Here are al
216d0 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  l of the sqlite3
216e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
216f0 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20  cts for each of 
21700 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73  the.** locking s
21710 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63  trategies.  Func
21720 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72  tions that retur
21730 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  n pointers to th
21740 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61  ese methods.** a
21750 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e  re also created.
21760 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  .*/.IOMETHODS(. 
21770 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20   posixIoFinder, 
21780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
21790 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
217a0 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d  me */.  posixIoM
217b0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
217c0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
217d0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
217e0 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20  ame */.  2,     
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21800 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
21810 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ory is enabled *
21820 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21840 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
21850 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21870 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
21880 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20  .  unixUnlock,  
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
218a0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
218b0 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
218c0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a  ervedLock     /*
218d0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
218e0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
218f0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c  IOMETHODS(.  nol
21900 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
21910 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
21920 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
21930 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  /.  nolockIoMeth
21940 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ods,          /*
21950 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
21960 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
21970 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21990 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
219a0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
219b0 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20   nolockClose,   
219c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
219d0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
219e0 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20   nolockLock,    
219f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
21a00 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
21a10 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  nolockUnlock,   
21a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
21a30 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
21a40 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
21a50 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43  rvedLock   /* xC
21a60 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
21a70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
21a80 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63  ETHODS(.  dotloc
21a90 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
21aa0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
21ab0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
21ac0 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   dotlockIoMethod
21ad0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  s,         /* sq
21ae0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
21af0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
21b00 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
21b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
21b20 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
21b30 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f  disabled */.  do
21b40 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  tlockClose,     
21b50 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
21b60 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  e method */.  do
21b70 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  tlockLock,      
21b80 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
21b90 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
21ba0 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
21bb0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
21bc0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
21bd0 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
21be0 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63  edLock  /* xChec
21bf0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
21c00 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53  thod */.)..#if S
21c10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
21c20 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
21c30 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
21c40 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69  ODS(.  flockIoFi
21c50 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
21c60 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
21c70 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c  ion name */.  fl
21c80 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
21c90 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
21ca0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
21cb0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
21cc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
21ce0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
21cf0 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  abled */.  flock
21d00 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
21d10 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
21d20 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
21d30 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
21d40 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
21d50 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55  thod */.  flockU
21d60 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
21d70 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
21d80 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
21d90 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
21da0 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
21db0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
21dc0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
21dd0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  if OS_VXWORKS.IO
21de0 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f  METHODS(.  semIo
21df0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
21e00 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
21e10 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
21e20 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20    semIoMethods, 
21e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
21e40 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
21e50 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
21e60 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
21e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21e80 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
21e90 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73   disabled */.  s
21ea0 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  emClose,        
21eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
21ec0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  se method */.  s
21ed0 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  emLock,         
21ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
21ef0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
21f00 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  mUnlock,        
21f10 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
21f20 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
21f30 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
21f40 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
21f50 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
21f60 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
21f70 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
21f80 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
21f90 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
21fa0 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
21fb0 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65  DS(.  afpIoFinde
21fc0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
21fd0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
21fe0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70  on name */.  afp
21ff0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
22000 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
22010 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
22020 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22040 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
22050 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
22060 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f  bled */.  afpClo
22070 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
22080 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
22090 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63  thod */.  afpLoc
220a0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
220b0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
220c0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f  hod */.  afpUnlo
220d0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
220e0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
220f0 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65  thod */.  afpChe
22100 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
22110 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
22120 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
22130 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
22140 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
22150 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20  cking method is 
22160 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22  a "super-method"
22170 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
22180 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73  at it.** opens s
22190 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65  econdary file de
221a0 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68  scriptors for th
221b0 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b  e conch and lock
221c0 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74   files and.** it
221d0 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74   uses proxy, dot
221e0 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20  -file, AFP, and 
221f0 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
22200 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65  methods on those
22210 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69  .** secondary fi
22220 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72  les.  For this r
22230 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
22240 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
22250 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63  nts.** proxy loc
22260 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20  king is located 
22270 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77  much further dow
22280 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  n in the file.  
22290 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74  But we need.** t
222a0 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  o go ahead and d
222b0 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65  efine the sqlite
222c0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64  3_io_methods and
222d0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
222e0 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  .** for proxy lo
222f0 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20  cking here.  So 
22300 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  we forward decla
22310 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  re the I/O metho
22320 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ds..*/.#if defin
22330 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
22340 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
22350 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
22360 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
22370 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  se(sqlite3_file*
22380 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
22390 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
223a0 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
223b0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
223c0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
223d0 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
223e0 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
223f0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
22400 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b  e3_file*, int*);
22410 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72  .IOMETHODS(.  pr
22420 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  oxyIoFinder,    
22430 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
22440 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
22450 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68  */.  proxyIoMeth
22460 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
22470 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
22480 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
22490 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224b0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
224c0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
224d0 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20    proxyClose,   
224e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
224f0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
22500 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20    proxyLock,    
22510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22520 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
22530 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20   proxyUnlock,   
22540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
22550 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
22560 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65    proxyCheckRese
22570 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78  rvedLock    /* x
22580 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
22590 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
225a0 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63  ndif../* nfs loc
225b0 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20  kd on OSX 10.3+ 
225c0 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72  doesn't clear wr
225d0 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61  ite locks when a
225e0 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
225f0 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  t */.#if defined
22600 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
22610 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
22620 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
22630 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e  HODS(.  nfsIoFin
22640 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
22650 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
22660 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
22670 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  nfsIoMethods,   
22680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
22690 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
226a0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
226b0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
226d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
226e0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75   disabled */.  u
226f0 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
22700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
22710 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
22720 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
22730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
22740 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
22750 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nfsUnlock,      
22760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
22770 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
22780 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
22790 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
227a0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
227b0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
227c0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
227d0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
227e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
227f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
22800 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
22810 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
22820 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
22830 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
22840 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
22850 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
22860 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
22870 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
22880 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
22890 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
228a0 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
228b0 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
228c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
228d0 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
228e0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
228f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
22900 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
22910 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
22920 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
22930 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
22940 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22950 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
22960 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
22970 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
22980 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
22990 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
229a0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
229b0 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
229c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
229d0 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
229e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
229f0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
22a00 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
22a10 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
22a20 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
22a30 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
22a40 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
22a50 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
22a60 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
22a70 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
22a80 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
22a90 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
22aa0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
22ab0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
22ac0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
22ad0 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
22ae0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
22af0 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
22b00 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
22b10 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
22b20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
22b30 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
22b40 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
22b50 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
22b60 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
22b70 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
22b80 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
22b90 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
22ba0 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
22bb0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
22bc0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
22bd0 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
22be0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
22bf0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
22c00 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
22c10 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
22c20 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
22c30 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
22c40 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
22c50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
22c60 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
22c70 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
22c80 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
22c90 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
22ca0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
22cb0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
22cc0 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
22cd0 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
22ce0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
22cf0 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
22d00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22d10 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
22d20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
22d30 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
22d40 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
22d50 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
22d60 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
22d70 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
22d80 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
22d90 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
22da0 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
22db0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
22dc0 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
22dd0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
22de0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
22df0 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
22e00 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
22e10 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
22e20 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
22e30 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
22e40 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
22e50 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
22e60 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
22e70 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
22e80 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
22e90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
22ea0 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
22eb0 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
22ec0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
22ed0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
22ee0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
22ef0 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
22f00 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
22f10 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
22f20 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
22f30 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
22f40 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
22f50 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
22f60 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
22f70 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
22f80 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
22f90 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
22fa0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
22fb0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
22fc0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  #if OS_VXWORKS &
22fd0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
22fe0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
22ff0 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
23000 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
23010 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
23020 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
23030 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
23040 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
23050 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
23060 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
23070 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
23080 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
23090 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
230a0 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
230b0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
230c0 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c   for VXWorks onl
230d0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
230e0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
230f0 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
23100 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
23110 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
23120 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
23130 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
23140 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
23150 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
23160 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66     /* the open f
23170 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ile object */.){
23180 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
23190 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
231a0 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
231b0 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
231c0 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
231d0 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
231e0 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
231f0 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
23200 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
23210 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
23220 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
23230 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
23240 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66   }..  /* Test if
23250 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70   fcntl() is supp
23260 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f  orted and use PO
23270 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
23280 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  .  ** Otherwise 
23290 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
232a0 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
232b0 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20   method..  */.  
232c0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
232d0 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
232e0 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
232f0 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
23300 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
23310 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
23320 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
23330 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
23340 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
23350 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
23360 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
23370 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
23380 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d  .    return &sem
23390 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
233a0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
233b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
233c0 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
233d0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
233e0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
233f0 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
23400 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
23410 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
23420 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
23430 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
23440 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  LE */../*.** An 
23450 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f  abstract type fo
23460 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
23470 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65   IO method finde
23480 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74  r function:.*/.t
23490 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c  ypedef const sql
234a0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
234b0 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28  *(*finder_type)(
234c0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
234d0 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a  File*);.../*****
234e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23520 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
23530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23540 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
23550 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
23560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23570 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
23580 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
23590 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
235a0 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
235b0 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
235c0 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
235d0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
235e0 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ize the contents
235f0 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
23600 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
23610 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f  ed to by pId..*/
23620 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
23630 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71  InUnixFile(.  sq
23640 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
23650 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
23660 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
23670 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  /.  int h,      
23680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23690 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
236a0 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e  tor of file bein
236b0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
236c0 74 20 64 69 72 66 64 2c 20 20 20 20 20 20 20 20  t dirfd,        
236d0 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
236e0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
236f0 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
23700 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20  file *pId,      
23710 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
23720 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
23730 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
23740 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
23750 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
23760 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
23770 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  pened */.  int n
23780 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  oLock,          
23790 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69     /* Omit locki
237a0 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  ng if true */.  
237b0 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
237c0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
237d0 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72  e on close if tr
237e0 75 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ue */.){.  const
237f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
23800 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79  ods *pLockingSty
23810 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
23820 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
23830 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63   *)pId;.  int rc
23840 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
23850 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
23860 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a  Inode==NULL );..
23870 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69    /* Parameter i
23880 73 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20  sDelete is only 
23890 75 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  used on vxworks.
238a0 20 45 78 70 72 65 73 73 20 74 68 69 73 20 65 78   Express this ex
238b0 70 6c 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68  plicitly .  ** h
238c0 65 72 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63  ere to prevent c
238d0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
238e0 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61   about unused pa
238f0 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  rameters..  */. 
23900 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
23910 52 28 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20  R(isDelete);..  
23920 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70  /* Usually the p
23930 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68  ath zFilename sh
23940 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65  ould not be a re
23950 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
23960 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74   The.  ** except
23970 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e  ion is when open
23980 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63  ing the proxy "c
23990 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75  onch" file in bu
239a0 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69  ilds that.  ** i
239b0 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69  nclude the speci
239c0 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67  al Apple locking
239d0 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69   styles..  */.#i
239e0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
239f0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
23a00 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
23a10 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46  YLE.  assert( zF
23a20 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
23a30 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
23a40 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41  .    || pVfs->pA
23a50 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26  ppData==(void*)&
23a60 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
23a70 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65   );.#else.  asse
23a80 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
23a90 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
23aa0 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a  =='/' );.#endif.
23ab0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
23ac0 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
23ad0 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b   h, zFilename));
23ae0 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
23af0 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20    pNew->dirfd = 
23b00 64 69 72 66 64 3b 0a 20 20 70 4e 65 77 2d 3e 66  dirfd;.  pNew->f
23b10 69 6c 65 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  ileFlags = 0;.  
23b20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46  pNew->zPath = zF
23b30 69 6c 65 6e 61 6d 65 3b 0a 0a 23 69 66 20 4f 53  ilename;..#if OS
23b40 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d  _VXWORKS.  pNew-
23b50 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69  >pId = vxworksFi
23b60 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61  ndFileId(zFilena
23b70 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  me);.  if( pNew-
23b80 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  >pId==0 ){.    n
23b90 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72  oLock = 1;.    r
23ba0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
23bb0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
23bc0 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20  if( noLock ){.  
23bd0 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
23be0 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  = &nolockIoMetho
23bf0 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
23c00 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
23c10 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65   (**(finder_type
23c20 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  *)pVfs->pAppData
23c30 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  )(zFilename, pNe
23c40 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  w);.#if SQLITE_E
23c50 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
23c60 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65  YLE.    /* Cache
23c70 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68   zFilename in th
23c80 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
23c90 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f  t (AFP and dotlo
23ca0 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72  ck override) for
23cb0 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63  .    ** proxyLoc
23cc0 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20  k activation is 
23cd0 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65  possible (remote
23ce0 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64 20   proxy is based 
23cf0 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20  on db name).    
23d00 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d  ** zFilename rem
23d10 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
23d20 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c   file is closed,
23d30 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20   to support */. 
23d40 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
23d50 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a  Context = (void*
23d60 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64  )zFilename;.#end
23d70 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  if.  }..  if( pL
23d80 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
23d90 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23  posixIoMethods.#
23da0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
23db0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
23dc0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
23dd0 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63  TYLE.    || pLoc
23de0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66  kingStyle == &nf
23df0 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69  sIoMethods.#endi
23e00 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45  f.  ){.    unixE
23e10 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
23e20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
23e30 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
23e40 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
23e50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23e60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
23e70 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
23e80 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  in findInodeInfo
23e90 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69  (), close the fi
23ea0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20  le descriptor.  
23eb0 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
23ec0 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61  ly, before relea
23ed0 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20  sing the mutex. 
23ee0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
23ef0 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a  may fail.      *
23f00 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  * in two scenari
23f10 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  os:.      **.   
23f20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61     **   (a) A ca
23f30 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61  ll to fstat() fa
23f40 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20  iled..      **  
23f50 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61   (b) A malloc fa
23f60 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  iled..      **. 
23f70 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f       ** Scenario
23f80 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63   (b) may only oc
23f90 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65  cur if the proce
23fa0 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f  ss is holding no
23fb0 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
23fc0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
23fd0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
23fe0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
23ff0 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65   were other file
24000 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
24010 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69  ptors on this fi
24020 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c  le, then no mall
24030 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75  oc would be requ
24040 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
24050 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
24060 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
24070 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69   case, it is qui
24080 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  te safe to close
24090 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  .      ** handle
240a0 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75   h - as it is gu
240b0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f  aranteed that no
240c0 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c   posix locks wil
240d0 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20  l be released.  
240e0 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20      ** by doing 
240f0 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  so..      **.   
24100 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69     ** If scenari
24110 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65  o (a) caused the
24120 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e   error then thin
24130 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61  gs are not so sa
24140 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  fe. The.      **
24150 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70   implicit assump
24160 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61  tion here is tha
24170 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69  t if fstat() fai
24180 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69  ls, things are i
24190 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20  n.      ** such 
241a0 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64  bad shape that d
241b0 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f  ropping a lock o
241c0 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61  r two doesn't ma
241d0 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20  tter much..     
241e0 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74   */.      robust
241f0 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
24200 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
24210 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20   h = -1;.    }. 
24220 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
24230 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51  x();.  }..#if SQ
24240 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
24250 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
24260 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
24270 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
24280 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70  ingStyle == &afp
24290 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
242a0 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20   /* AFP locking 
242b0 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
242c0 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
242d0 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
242e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c  .    ** the afpL
242f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20  ockingContext.. 
24300 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63     */.    afpLoc
24310 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
24320 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  x;.    pNew->loc
24330 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
24340 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  tx = sqlite3_mal
24350 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  loc( sizeof(*pCt
24360 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  x) );.    if( pC
24370 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  tx==0 ){.      r
24380 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
24390 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
243a0 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e     /* NB: zFilen
243b0 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72  ame exists and r
243c0 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
243d0 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  il the file is c
243e0 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  losed.      ** a
243f0 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75  ccording to requ
24400 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20  irement F11141. 
24410 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65   So we do not ne
24420 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20  ed to make a.   
24430 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
24440 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20  e filename. */. 
24450 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74       pCtx->dbPat
24460 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
24470 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72       pCtx->reser
24480 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ved = 0;.      s
24490 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20  randomdev();.   
244a0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
244b0 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x();.      rc = 
244c0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
244d0 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
244e0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
244f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
24510 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  ree(pNew->lockin
24520 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  gContext);.     
24530 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
24540 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
24550 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20  _);.        h = 
24560 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
24570 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
24580 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ();        .    
24590 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
245a0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
245b0 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f  gStyle == &dotlo
245c0 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
245d0 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f     /* Dotfile lo
245e0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
245f0 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
24600 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
24610 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
24620 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
24630 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a  Context .    */.
24640 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46      char *zLockF
24650 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  ile;.    int nFi
24660 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c  lename;.    nFil
24670 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72  ename = (int)str
24680 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  len(zFilename) +
24690 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c   6;.    zLockFil
246a0 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
246b0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65  te3_malloc(nFile
246c0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  name);.    if( z
246d0 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  LockFile==0 ){. 
246e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
246f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
24700 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
24710 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e  _snprintf(nFilen
24720 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20  ame, zLockFile, 
24730 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  "%s" DOTLOCK_SUF
24740 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  FIX, zFilename);
24750 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
24760 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
24770 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d  = zLockFile;.  }
24780 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
24790 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
247a0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65  kingStyle == &se
247b0 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  mIoMethods ){.  
247c0 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70    /* Named semap
247d0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  hore locking use
247e0 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
247f0 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
24800 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65  e.    ** include
24810 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b  d in the semLock
24820 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a  ingContext.    *
24830 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  /.    unixEnterM
24840 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
24850 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
24860 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
24870 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  de);.    if( (rc
24880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
24890 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70  (pNew->pInode->p
248a0 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20  Sem==NULL) ){.  
248b0 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61      char *zSemNa
248c0 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64  me = pNew->pInod
248d0 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20  e->aSemName;.   
248e0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
248f0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
24900 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
24910 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65  SemName, "/%s.se
24920 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  m",.            
24930 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
24940 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  >pId->zCanonical
24950 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  Name);.      for
24960 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b  ( n=1; zSemName[
24970 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20  n]; n++ ).      
24980 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e    if( zSemName[n
24990 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d  ]=='/' ) zSemNam
249a0 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20  e[n] = '_';.    
249b0 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
249c0 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28  pSem = sem_open(
249d0 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41  zSemName, O_CREA
249e0 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20  T, 0666, 1);.   
249f0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e     if( pNew->pIn
24a00 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d  ode->pSem == SEM
24a10 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
24a20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
24a30 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e  OMEM;.        pN
24a40 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d  ew->pInode->aSem
24a50 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  Name[0] = '\0';.
24a60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24a70 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
24a80 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ();.  }.#endif. 
24a90 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72   .  pNew->lastEr
24aa0 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f  rno = 0;.#if OS_
24ab0 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
24ac0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24ad0 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
24ae0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
24af0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
24b00 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 75     h = -1;.    u
24b10 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
24b20 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d  ;.    isDelete =
24b30 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
24b40 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65 6c  isDelete = isDel
24b50 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ete;.#endif.  if
24b60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24b70 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72 66 64  ){.    if( dirfd
24b80 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
24b90 73 65 28 70 4e 65 77 2c 20 64 69 72 66 64 2c 20  se(pNew, dirfd, 
24ba0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 69  __LINE__);.    i
24bb0 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
24bc0 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
24bd0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c  __LINE__);.  }el
24be0 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d  se{.    pNew->pM
24bf0 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67  ethod = pLocking
24c00 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43  Style;.    OpenC
24c10 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a  ounter(+1);.  }.
24c20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24c30 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
24c40 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
24c50 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
24c60 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46  ntaining file zF
24c70 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73  ilename..** If s
24c80 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20  uccessful, *pFd 
24c90 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70  is set to the op
24ca0 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ened file descri
24cb0 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  ptor and.** SQLI
24cc0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
24cd0 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
24ce0 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51  ccurs, either SQ
24cf0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72  LITE_NOMEM.** or
24d00 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
24d10 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
24d20 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
24d30 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20  an undefined.** 
24d40 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  value..**.** If 
24d50 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
24d60 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  urned, the calle
24d70 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
24d80 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20   for closing.** 
24d90 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
24da0 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63  tor *pFd using c
24db0 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lose()..*/.stati
24dc0 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
24dd0 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ory(const char *
24de0 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a  zFilename, int *
24df0 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  pFd){.  int ii;.
24e00 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
24e10 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d   char zDirname[M
24e20 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
24e30 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
24e40 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
24e50 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22  , zDirname, "%s"
24e60 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
24e70 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c  for(ii=(int)strl
24e80 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69  en(zDirname); ii
24e90 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69  >1 && zDirname[i
24ea0 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a  i]!='/'; ii--);.
24eb0 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20    if( ii>0 ){.  
24ec0 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d    zDirname[ii] =
24ed0 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20   '\0';.    fd = 
24ee0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72  robust_open(zDir
24ef0 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f  name, O_RDONLY|O
24f00 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20  _BINARY, 0);.   
24f10 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69   if( fd>=0 ){.#i
24f20 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a  fdef FD_CLOEXEC.
24f30 20 20 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64        osFcntl(fd
24f40 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e  , F_SETFD, osFcn
24f50 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20  tl(fd, F_GETFD, 
24f60 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29  0) | FD_CLOEXEC)
24f70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f  ;.#endif.      O
24f80 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52  STRACE(("OPENDIR
24f90 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c   %-3d %s\n", fd,
24fa0 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20   zDirname));.   
24fb0 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20   }.  }.  *pFd = 
24fc0 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64  fd;.  return (fd
24fd0 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e  >=0?SQLITE_OK:un
24fe0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
24ff0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
25000 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d   "open", zDirnam
25010 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  e));.}../*.** Re
25020 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
25030 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20   a directory in 
25040 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d  which to put tem
25050 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
25060 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
25070 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64  temporary file d
25080 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20  irectory can be 
25090 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55  found, return NU
250a0 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
250b0 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65  nst char *unixTe
250c0 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b  mpFileDir(void){
250d0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
250e0 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d  char *azDirs[] =
250f0 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20   {.     0,.     
25100 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  0,.     "/var/tm
25110 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74  p",.     "/usr/t
25120 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22  mp",.     "/tmp"
25130 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20  ,.     0        
25140 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74  /* List terminat
25150 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73  or */.  };.  uns
25160 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73  igned int i;.  s
25170 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
25180 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
25190 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72  ir = 0;..  azDir
251a0 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74  s[0] = sqlite3_t
251b0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
251c0 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
251d0 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
251e0 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
251f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
25200 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
25210 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a  of(azDirs[0]); z
25220 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29  Dir=azDirs[i++])
25230 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d  {.    if( zDir==
25240 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
25250 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69    if( osStat(zDi
25260 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  r, &buf) ) conti
25270 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
25280 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
25290 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
252a0 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28     if( osAccess(
252b0 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74  zDir, 07) ) cont
252c0 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b  inue;.    break;
252d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44  .  }.  return zD
252e0 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ir;.}../*.** Cre
252f0 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
25300 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
25310 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
25320 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
25330 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
25340 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65  cess and must be
25350 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
25360 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  old at least.** 
25370 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
25380 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
25390 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
253a0 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
253b0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
253c0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
253d0 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73  gned char zChars
253e0 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
253f0 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
25400 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
25410 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
25420 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
25430 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67  456789";.  unsig
25440 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ned int i, j;.  
25450 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
25460 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
25470 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
25480 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
25490 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
254a0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
254b0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
254c0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
254d0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
254e0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
254f0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
25500 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
25510 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
25520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
25530 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20  RR );..  zDir = 
25540 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
25550 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  );.  if( zDir==0
25560 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a   ) zDir = ".";..
25570 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
25580 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
25590 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
255a0 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
255b0 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
255c0 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ame. If it is no
255d0 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
255e0 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69  _ERROR..  */.  i
255f0 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29  f( (strlen(zDir)
25600 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45   + strlen(SQLITE
25610 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
25620 58 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a  X) + 17) >= (siz
25630 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20  e_t)nBuf ){.    
25640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
25650 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a  ROR;.  }..  do{.
25660 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
25670 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42  intf(nBuf-17, zB
25680 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f  uf, "%s/"SQLITE_
25690 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
256a0 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d  , zDir);.    j =
256b0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75   (int)strlen(zBu
256c0 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  f);.    sqlite3_
256d0 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
256e0 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f  zBuf[j]);.    fo
256f0 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b  r(i=0; i<15; i++
25700 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42  , j++){.      zB
25710 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
25720 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
25730 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
25740 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
25750 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ) ];.    }.    z
25760 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77  Buf[j] = 0;.  }w
25770 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a  hile( osAccess(z
25780 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72  Buf,0)==0 );.  r
25790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
257a0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
257b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
257c0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
257d0 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
257e0 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73  Routine to trans
257f0 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20  form a unixFile 
25800 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63  into a proxy-loc
25810 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a  king unixFile..*
25820 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
25830 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f   in the proxy-lo
25840 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74  ck division, but
25850 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65   used by unixOpe
25860 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45  n().** if SQLITE
25870 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
25880 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64  CKING is defined
25890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
258a0 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
258b0 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a  ixFile(unixFile*
258c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
258d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
258e0 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
258f0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
25900 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  or that was open
25910 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
25920 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74  se .** file (not
25930 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61   a journal or ma
25940 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
25950 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  e) identified by
25960 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61   pathname.** zPa
25970 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  th with SQLITE_O
25980 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61  PEN_XXX flags ma
25990 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73  tching those pas
259a0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
259b0 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  d.** argument to
259c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
259d0 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c  **.** Such a fil
259e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79  e descriptor may
259f0 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61   exist if a data
25a00 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
25a10 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75  was closed.** bu
25a20 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
25a30 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
25a40 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c   could not be cl
25a50 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d  osed because som
25a60 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20  e.** other file 
25a70 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
25a80 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
25a90 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69   is holding a fi
25aa0 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65  le-lock..** Refe
25ab0 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  r to comments in
25ac0 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29   the unixClose()
25ad0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68   function and th
25ae0 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e  e lengthy commen
25af0 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  t.** describing 
25b00 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20  "Posix Advisory 
25b10 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20  Locking" at the 
25b20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69  start of this fi
25b30 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68  le for .** furth
25b40 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f  er details. Also
25b50 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a  , ticket #4018..
25b60 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61  **.** If a suita
25b70 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ble file descrip
25b80 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  tor is found, th
25b90 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  en it is returne
25ba0 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68  d. If no.** such
25bb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
25bc0 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20   is located, -1 
25bd0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
25be0 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65  static UnixUnuse
25bf0 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c  dFd *findReusabl
25c00 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eFd(const char *
25c10 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73  zPath, int flags
25c20 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  ){.  UnixUnusedF
25c30 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  d *pUnused = 0;.
25c40 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61  .  /* Do not sea
25c50 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
25c60 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
25c70 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f  r on vxworks. No
25c80 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76  t because.  ** v
25c90 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74  xworks would not
25ca0 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68   benefit from th
25cb0 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67  e change (it mig
25cc0 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75  ht, we're not su
25cd0 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65  re),.  ** but be
25ce0 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20  cause no way to 
25cf0 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65  test it is curre
25d00 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20  ntly available. 
25d10 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20  It is better .  
25d20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62  ** not to risk b
25d30 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20  reaking vxworks 
25d40 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20  support for the 
25d50 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20  sake of such an 
25d60 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65  obscure .  ** fe
25d70 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21  ature.  */.#if !
25d80 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
25d90 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
25da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25db0 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20    /* Results of 
25dc0 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a  stat() call */..
25dd0 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61    /* A stat() ca
25de0 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20  ll may fail for 
25df0 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e  various reasons.
25e00 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
25e10 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d  , it is.  ** alm
25e20 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74  ost certain that
25e30 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20   an open() call 
25e40 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
25e50 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e   will also fail.
25e60 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72  .  ** For this r
25e70 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72  eason, if an err
25e80 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
25e90 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72   stat() call her
25ea0 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67  e, it is.  ** ig
25eb0 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20  nored and -1 is 
25ec0 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
25ed0 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f  ller will try to
25ee0 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
25ef0 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  .  ** descriptor
25f00 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
25f10 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74  h, fail, and ret
25f20 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  urn an error to 
25f30 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a  SQLite..  **.  *
25f40 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73  * Even if a subs
25f50 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61  equent open() ca
25f60 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c  ll does succeed,
25f70 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65   the consequence
25f80 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65  s of.  ** not se
25f90 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65  arching for a re
25fa0 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73  susable file des
25fb0 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20  criptor are not 
25fc0 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  dire.  */.  if( 
25fd0 30 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c 20 26  0==stat(zPath, &
25fe0 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e  sStat) ){.    un
25ff0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
26000 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e  ode;..    unixEn
26010 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
26020 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69  pInode = inodeLi
26030 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  st;.    while( p
26040 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64 65  Inode && (pInode
26050 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73 53  ->fileId.dev!=sS
26060 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20 20  tat.st_dev.     
26070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26080 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  || pInode->fileI
26090 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f  d.ino!=sStat.st_
260a0 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70  ino) ){.       p
260b0 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  Inode = pInode->
260c0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
260d0 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20   if( pInode ){. 
260e0 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46       UnixUnusedF
260f0 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f  d **pp;.      fo
26100 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55  r(pp=&pInode->pU
26110 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a  nused; *pp && (*
26120 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67  pp)->flags!=flag
26130 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70  s; pp=&((*pp)->p
26140 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55  Next));.      pU
26150 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20  nused = *pp;.   
26160 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29     if( pUnused )
26170 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20  {.        *pp = 
26180 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a  pUnused->pNext;.
26190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
261a0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
261b0 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20  ();.  }.#endif  
261c0 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f    /* if !OS_VXWO
261d0 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  RKS */.  return 
261e0 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  pUnused;.}../*.*
261f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26200 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69  is called by uni
26210 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72  xOpen() to deter
26220 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65  mine the unix pe
26230 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20  rmissions.** to 
26240 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73  create new files
26250 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72   with. If no err
26260 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
26270 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
26280 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76  urned.** and a v
26290 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f  alue suitable fo
262a0 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68 65  r passing as the
262b0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
262c0 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a  to open(2) is.**
262d0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f   written to *pMo
262e0 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  de. If an IO err
262f0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
26300 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
26310 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
26320 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
26330 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d   *pMode is not m
26340 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  odified..**.** I
26350 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
26360 20 6f 70 65 6e 65 64 20 69 73 20 61 20 74 65 6d   opened is a tem
26370 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 69 74 20  porary file, it 
26380 69 73 20 61 6c 77 61 79 73 20 63 72 65 61 74 65  is always create
26390 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6f 63  d with.** the oc
263a0 74 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  tal permissions 
263b0 30 36 30 30 20 28 72 65 61 64 2f 77 72 69 74 61  0600 (read/writa
263c0 62 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f 6e 6c  ble by owner onl
263d0 79 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a  y). If the file.
263e0 2a 2a 20 69 73 20 61 20 64 61 74 61 62 61 73 65  ** is a database
263f0 20 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   or master journ
26400 61 6c 20 66 69 6c 65 2c 20 69 74 20 69 73 20 63  al file, it is c
26410 72 65 61 74 65 64 20 77 69 74 68 20 74 68 65 20  reated with the 
26420 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20  permissions .** 
26430 6d 61 73 6b 20 53 51 4c 49 54 45 5f 44 45 46 41  mask SQLITE_DEFA
26440 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
26450 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61  IONS..**.** Fina
26460 6c 6c 79 2c 20 69 66 20 74 68 65 20 66 69 6c 65  lly, if the file
26470 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
26480 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61   a WAL or regula
26490 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  r journal file, 
264a0 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  then .** this fu
264b0 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74  nction queries t
264c0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
264d0 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  or the permissio
264e0 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f  ns on the .** co
264f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
26500 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65  base file and se
26510 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69  ts *pMode to thi
26520 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65  s value. Wheneve
26530 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20  r .** possible, 
26540 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  WAL and journal 
26550 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
26560 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
26570 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
26580 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   as the associat
26590 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
265a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
265b0 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
265c0 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de(.  const char
265d0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
265e0 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
265f0 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29   file (possibly)
26600 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a   being created *
26610 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
26620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26630 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
26640 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d  sed as 4th argum
26650 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a  ent to xOpen() *
26660 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64  /.  mode_t *pMod
26670 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
26680 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d      /* OUT: Perm
26690 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20  issions to open 
266a0 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 29 7b 0a  file with */.){.
266b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
266c0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
266d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
266e0 20 2a 2f 0a 20 20 69 66 28 20 66 6c 61 67 73 20   */.  if( flags 
266f0 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
26700 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
26710 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
26720 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58      char zDb[MAX
26730 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20  _PATHNAME+1];   
26740 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
26750 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69  le path */.    i
26760 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20  nt nDb;         
26770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26780 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
26790 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a  bytes in zDb */.
267a0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
267b0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
267c0 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73    /* Output of s
267d0 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73  tat() on databas
267e0 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  e file */..    /
267f0 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74  * zPath is a pat
26800 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f  h to a WAL or jo
26810 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
26820 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
26830 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74  derives.    ** t
26840 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61  he path to the a
26850 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
26860 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61  se file from zPa
26870 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68  th. This block h
26880 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68  andles.    ** th
26890 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69  e following nami
268a0 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a  ng conventions:.
268b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
268c0 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
268d0 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  urnal".    **   
268e0 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61  "<path to db>-wa
268f0 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
26900 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
26910 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20 2a 2a 20 20  l-NNNN".    **  
26920 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
26930 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20 2a 2a 0a  al-NNNN".    **.
26940 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 4e      ** where NNN
26950 4e 20 69 73 20 61 20 34 20 64 69 67 69 74 20 64  N is a 4 digit d
26960 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54  ecimal number. T
26970 68 65 20 4e 4e 4e 4e 20 6e 61 6d 69 6e 67 20 73  he NNNN naming s
26980 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20  chemes are .    
26990 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 74  ** used by the t
269a0 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20  est_multiplex.c 
269b0 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  module..    */. 
269c0 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33     nDb = sqlite3
269d0 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20  Strlen30(zPath) 
269e0 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28  - 1; .    while(
269f0 20 6e 44 62 3e 30 20 26 26 20 7a 50 61 74 68 5b   nDb>0 && zPath[
26a00 6e 44 62 5d 21 3d 27 6c 27 20 29 20 6e 44 62 2d  nDb]!='l' ) nDb-
26a10 2d 3b 0a 20 20 20 20 6e 44 62 20 2d 3d 20 28 28  -;.    nDb -= ((
26a20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
26a30 50 45 4e 5f 57 41 4c 29 20 3f 20 33 20 3a 20 37  PEN_WAL) ? 3 : 7
26a40 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  );.    memcpy(zD
26a50 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a  b, zPath, nDb);.
26a60 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27      zDb[nDb] = '
26a70 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d  \0';..    if( 0=
26a80 3d 73 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61  =stat(zDb, &sSta
26a90 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f  t) ){.      *pMo
26aa0 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f  de = sStat.st_mo
26ab0 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 7d  de & 0777;.    }
26ac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
26ad0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
26ae0 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  TAT;.    }.  }el
26af0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
26b00 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
26b10 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20  EONCLOSE ){.    
26b20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20  *pMode = 0600;. 
26b30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4d 6f   }else{.    *pMo
26b40 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  de = SQLITE_DEFA
26b50 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
26b60 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 72 65 74 75  IONS;.  }.  retu
26b70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26b80 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50  Open the file zP
26b90 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76  ath..** .** Prev
26ba0 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69  iously, the SQLi
26bb0 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64  te OS layer used
26bc0 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
26bd0 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69   in place of thi
26be0 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  s.** one:.**.** 
26bf0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
26c00 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a  nReadWrite();.**
26c10 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
26c20 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a  enReadOnly();.**
26c30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
26c40 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a  enExclusive();.*
26c50 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73  *.** These calls
26c60 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
26c70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
26c80 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61  binations of fla
26c90 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65  gs:.**.**     Re
26ca0 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20  adWrite() ->    
26cb0 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
26cc0 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61  EATE).**     Rea
26cd0 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20  dOnly()  ->     
26ce0 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20  (READONLY) .**  
26cf0 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65     OpenExclusive
26d00 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45  () -> (READWRITE
26d10 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c   | CREATE | EXCL
26d20 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65  USIVE).**.** The
26d30 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69   old OpenExclusi
26d40 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20  ve() accepted a 
26d50 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74  boolean argument
26d60 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66   - "delFlag". If
26d70 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69  .** true, the fi
26d80 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65  le was configure
26d90 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69  d to be automati
26da0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
26db0 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68  en the.** file h
26dc0 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f  andle closed. To
26dd0 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d   achieve the sam
26de0 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74  e effect using t
26df0 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65  his new .** inte
26e00 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44  rface, add the D
26e10 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61  ELETEONCLOSE fla
26e20 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  g to those speci
26e30 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a  fied above for .
26e40 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ** OpenExclusive
26e50 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
26e60 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71  t unixOpen(.  sq
26e70 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
26e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26e90 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20  e VFS for which 
26ea0 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65  this is the xOpe
26eb0 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  n method */.  co
26ec0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
26ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
26ee0 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  thname of file t
26ef0 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
26f00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
26f10 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  File,         /*
26f20 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
26f30 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65  ptor to be fille
26f40 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  d in */.  int fl
26f50 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
26f60 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
26f70 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c  flags to control
26f80 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a   the opening */.
26f90 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
26fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26fb0 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72  * Output flags r
26fc0 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
26fd0 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  e core */.){.  u
26fe0 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e  nixFile *p = (un
26ff0 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  ixFile *)pFile;.
27000 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20    int fd = -1;  
27010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27020 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
27030 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  tor returned by 
27040 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
27050 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 20  dirfd = -1;     
27060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
27070 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
27080 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
27090 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20   openFlags = 0; 
270a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
270b0 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
270c0 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
270d0 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
270e0 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
270f0 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
27100 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f  en */.  int noLo
27110 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
27120 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
27130 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70  o omit locking p
27140 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69  rimitives */.  i
27150 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27160 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
27170 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
27180 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e 74 20   Code */..  int 
27190 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
271a0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
271b0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
271c0 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
271d0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
271e0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
271f0 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
27200 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
27210 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
27220 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
27230 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
27240 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
27250 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
27260 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
27270 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
27280 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
27290 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49  WRITE);.#if SQLI
272a0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
272b0 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73  G_STYLE.  int is
272c0 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c  AutoProxy  = (fl
272d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
272e0 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65  N_AUTOPROXY);.#e
272f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72  ndif..  /* If cr
27300 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  eating a master 
27310 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75  or main-file jou
27320 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  rnal, this funct
27330 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20  ion will open.  
27340 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69  ** a file-descri
27350 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65  ptor on the dire
27360 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66  ctory too. The f
27370 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79  irst time unixSy
27380 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c  nc().  ** is cal
27390 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72  led the director
273a0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
273b0 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28  r will be fsync(
273c0 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64  )ed and close()d
273d0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ..  */.  int isO
273e0 70 65 6e 44 69 72 65 63 74 6f 72 79 20 3d 20 28  penDirectory = (
273f0 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
27400 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
27410 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
27420 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
27430 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
27440 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
27450 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
27460 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
27470 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  .  ));..  /* If 
27480 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
27490 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
274a0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
274b0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
274c0 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
274d0 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
274e0 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
274f0 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
27500 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
27510 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
27520 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f  ATHNAME+1];.  co
27530 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
27540 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43  = zPath;..  /* C
27550 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
27560 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
27570 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
27580 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
27590 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
275a0 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
275b0 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
275c0 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
275d0 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
275e0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
275f0 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
27600 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
27610 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
27620 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
27630 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
27640 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
27650 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
27660 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
27670 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
27680 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
27690 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
276a0 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
276b0 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
276c0 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
276d0 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
276e0 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
276f0 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
27700 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
27710 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
27720 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
27730 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
27740 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
27750 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
27760 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
27770 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
27780 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
27790 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ver .  ** automa
277a0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
277b0 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
277c0 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
277d0 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
277e0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
277f0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
27800 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
27810 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
27820 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
27830 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
27840 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
27850 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
27860 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
27870 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
27880 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
27890 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
278a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
278b0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
278c0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
278d0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
278e0 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
278f0 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
27900 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
27910 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
27920 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
27930 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
27940 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
27950 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
27960 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
27970 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
27980 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
27990 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
279a0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
279b0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
279c0 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
279d0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
279e0 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
279f0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
27a00 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
27a10 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
27a20 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
27a30 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
27a40 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
27a50 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 6d 65  N_WAL.  );..  me
27a60 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
27a70 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20  f(unixFile));.. 
27a80 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
27a90 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
27aa0 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65  ){.    UnixUnuse
27ab0 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20  dFd *pUnused;.  
27ac0 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
27ad0 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65  ReusableFd(zName
27ae0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
27af0 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
27b00 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
27b10 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >fd;.    }else{.
27b20 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
27b30 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
27b40 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
27b50 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55 6e  ;.      if( !pUn
27b60 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
27b70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27b80 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
27b90 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65   }.    p->pUnuse
27ba0 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 7d  d = pUnused;.  }
27bb0 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20  else if( !zName 
27bc0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  ){.    /* If zNa
27bd0 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  me is NULL, the 
27be0 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72  upper layer is r
27bf0 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70  equesting a temp
27c00 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73   file. */.    as
27c10 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26  sert(isDelete &&
27c20 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72   !isOpenDirector
27c30 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69  y);.    rc = uni
27c40 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58  xGetTempname(MAX
27c50 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d  _PATHNAME+1, zTm
27c60 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
27c70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27c80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
27c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
27ca0 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20  e = zTmpname;.  
27cb0 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  }..  /* Determin
27cc0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
27cd0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
27ce0 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53  er passed to POS
27cf0 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  IX function.  **
27d00 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d   open(). These m
27d10 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65  ust be calculate
27d20 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29  d even if open()
27d30 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20   is not called, 
27d40 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79  as.  ** they may
27d50 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61   be stored as pa
27d60 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  rt of the file h
27d70 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62  andle and used b
27d80 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e  y the .  ** 'con
27d90 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67  ch file' locking
27da0 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72   functions later
27db0 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69   on.  */.  if( i
27dc0 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65  sReadonly )  ope
27dd0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
27de0 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64  LY;.  if( isRead
27df0 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67  Write ) openFlag
27e00 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69  s |= O_RDWR;.  i
27e10 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20  f( isCreate )   
27e20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
27e30 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45  CREAT;.  if( isE
27e40 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46  xclusive ) openF
27e50 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c  lags |= (O_EXCL|
27e60 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f  O_NOFOLLOW);.  o
27e70 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c  penFlags |= (O_L
27e80 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
27e90 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20  Y);..  if( fd<0 
27ea0 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70  ){.    mode_t op
27eb0 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  enMode;         
27ec0 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69       /* Permissi
27ed0 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69  ons to create fi
27ee0 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 72  le with */.    r
27ef0 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69  c = findCreateFi
27f00 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c  leMode(zName, fl
27f10 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 29 3b  ags, &openMode);
27f20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
27f30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27f40 61 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75  assert( !p->pUnu
27f50 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  sed );.      ass
27f60 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
27f70 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65  TE_OPEN_WAL || e
27f80 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
27f90 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
27fa0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
27fb0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20  c;.    }.    fd 
27fc0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e  = robust_open(zN
27fd0 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
27fe0 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f  openMode);.    O
27ff0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20  STRACE(("OPENX  
28000 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c   %-3d %s 0%o\n",
28010 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e   fd, zName, open
28020 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66 28  Flags));.    if(
28030 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d   fd<0 && errno!=
28040 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61 64  EISDIR && isRead
28050 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c  Write && !isExcl
28060 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f  usive ){.      /
28070 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * Failed to open
28080 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65   the file for re
28090 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
280a0 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20   Try read-only. 
280b0 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26  */.      flags &
280c0 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
280d0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
280e0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
280f0 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26       openFlags &
28100 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  = ~(O_RDWR|O_CRE
28110 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  AT);.      flags
28120 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
28130 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
28140 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
28150 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 66 64 20  DONLY;.      fd 
28160 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e  = robust_open(zN
28170 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
28180 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  openMode);.    }
28190 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
281a0 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
281b0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
281c0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
281d0 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  open", zName);. 
281e0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
281f0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
28200 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e   }.  assert( fd>
28210 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74  =0 );.  if( pOut
28220 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f  Flags ){.    *pO
28230 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  utFlags = flags;
28240 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70  .  }..  if( p->p
28250 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d  Unused ){.    p-
28260 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66  >pUnused->fd = f
28270 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  d;.    p->pUnuse
28280 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  d->flags = flags
28290 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44  ;.  }..  if( isD
282a0 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f  elete ){.#if OS_
282b0 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74  VXWORKS.    zPat
282c0 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65  h = zName;.#else
282d0 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d  .    unlink(zNam
282e0 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  e);.#endif.  }.#
282f0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
28300 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
28310 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70   else{.    p->op
28320 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
28330 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ags;.  }.#endif.
28340 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69 72  .  if( isOpenDir
28350 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 72 63  ectory ){.    rc
28360 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79   = openDirectory
28370 28 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b  (zPath, &dirfd);
28380 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
28390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
283a0 2f 2a 20 49 74 20 69 73 20 73 61 66 65 20 74 6f  /* It is safe to
283b0 20 63 6c 6f 73 65 20 66 64 20 61 74 20 74 68 69   close fd at thi
283c0 73 20 70 6f 69 6e 74 2c 20 62 65 63 61 75 73 65  s point, because
283d0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
283e0 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74  d not.      ** t
283f0 6f 20 62 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64  o be open on a d
28400 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
28410 20 69 74 20 77 65 72 65 20 6f 70 65 6e 20 6f 6e   it were open on
28420 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
28430 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 77 6f  ,.      ** it wo
28440 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20  uld not be safe 
28450 74 6f 20 63 6c 6f 73 65 20 61 73 20 74 68 69 73  to close as this
28460 20 77 6f 75 6c 64 20 72 65 6c 65 61 73 65 20 61   would release a
28470 6e 79 20 6c 6f 63 6b 73 20 68 65 6c 64 0a 20 20  ny locks held.  
28480 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69      ** on the fi
28490 6c 65 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  le by this proce
284a0 73 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73  ss.  */.      as
284b0 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c  sert( eType!=SQL
284c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
284d0 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   );.      robust
284e0 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
284f0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 67  LINE__);.      g
28500 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
28510 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  d;.    }.  }..#i
28520 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a  fdef FD_CLOEXEC.
28530 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
28540 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66  SETFD, osFcntl(f
28550 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  d, F_GETFD, 0) |
28560 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
28570 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d  ndif..  noLock =
28580 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
28590 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20  PEN_MAIN_DB;..  
285a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
285b0 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
285c0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
285d0 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20  _STYLE.  struct 
285e0 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
285f0 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c   if( fstatfs(fd,
28600 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
28610 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
28620 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45  e*)pFile)->lastE
28630 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
28640 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29    if( dirfd>=0 )
28650 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
28660 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   dirfd, __LINE__
28670 29 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  );.    robust_cl
28680 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(p, fd, __LIN
28690 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E__);.    return
286a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
286b0 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28  CESS;.  }.  if (
286c0 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73  0 == strncmp("ms
286d0 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66  dos", fsInfo.f_f
286e0 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b  stypename, 5)) {
286f0 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
28700 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73  )pFile)->fsFlags
28710 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41   |= SQLITE_FSFLA
28720 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d  GS_IS_MSDOS;.  }
28730 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20 53  .#endif.  .#if S
28740 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
28750 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53  KING_STYLE.#if S
28760 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
28770 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41  XY_LOCKING.  isA
28780 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65  utoProxy = 1;.#e
28790 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74  ndif.  if( isAut
287a0 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68  oProxy && (zPath
287b0 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c  !=NULL) && (!noL
287c0 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f  ock) && pVfs->xO
287d0 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  pen ){.    char 
287e0 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65  *envforce = gete
287f0 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45  nv("SQLITE_FORCE
28800 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29  _PROXY_LOCKING")
28810 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f  ;.    int usePro
28820 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  xy = 0;..    /* 
28830 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
28840 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65  XY_LOCKING==1 me
28850 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73  ans force always
28860 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65   use proxy, 0 me
28870 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65  ans .    ** neve
28880 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c  r use proxy, NUL
28890 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78  L means use prox
288a0 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  y for non-local 
288b0 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a  files only.  */.
288c0 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65      if( envforce
288d0 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
288e0 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28  useProxy = atoi(
288f0 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20  envforce)>0;.   
28900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
28910 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
28920 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  fo;.      if( st
28930 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49  atfs(zPath, &fsI
28940 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
28950 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
28960 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64  ry, the close(fd
28970 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70  ) call is sub-op
28980 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69  timal. If the fi
28990 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20  le opened.      
289a0 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20    ** with fd is 
289b0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
289c0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f   and there are o
289d0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
289e0 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
289f0 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
28a00 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
28a10 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72   holding advisor
28a20 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20  y locks on it,. 
28a30 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
28a40 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65  he call to close
28a50 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74  () will cancel t
28a60 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70  hose locks. In p
28a70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20  ractice,.       
28a80 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69   ** we're assumi
28a90 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28 29  ng that statfs()
28aa0 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65   doesn't fail ve
28ab0 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61  ry often. At lea
28ac0 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  st.        ** no
28ad0 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69  t while other fi
28ae0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
28af0 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d  pened by the sam
28b00 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20  e process on.   
28b10 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65       ** the same
28b20 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e   file are workin
28b30 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  g.  */.        p
28b40 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
28b50 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rno;.        if(
28b60 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20   dirfd>=0 ){.   
28b70 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c         robust_cl
28b80 6f 73 65 28 70 2c 20 64 69 72 66 64 2c 20 5f 5f  ose(p, dirfd, __
28b90 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
28ba0 20 7d 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73   }.        robus
28bb0 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
28bc0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
28bd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
28be0 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20  ERR_ACCESS;.    
28bf0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
28c00 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nished;.      }.
28c10 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
28c20 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67   !(fsInfo.f_flag
28c30 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20  s&MNT_LOCAL);.  
28c40 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50    }.    if( useP
28c50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63  roxy ){.      rc
28c60 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
28c70 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66  e(pVfs, fd, dirf
28c80 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c  d, pFile, zPath,
28c90 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74   noLock, isDelet
28ca0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
28cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28cc0 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78         rc = prox
28cd0 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
28ce0 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46  le((unixFile*)pF
28cf0 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  ile, ":auto:");.
28d00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28d20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e         /* Use un
28d30 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e  ixClose to clean
28d40 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65   up the resource
28d50 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49  s added in fillI
28d60 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20  nUnixFile .     
28d70 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61       ** and clea
28d80 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74  r all the struct
28d90 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73  ure's references
28da0 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .  Specifically,
28db0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
28dc0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77  File->pMethods w
28dd0 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73  ill be NULL so s
28de0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69  qlite3OsClose wi
28df0 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20  ll be a no-op . 
28e00 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
28e10 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28        unixClose(
28e20 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
28e30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28e50 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
28e60 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
28e70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
28e80 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
28e90 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72  le(pVfs, fd, dir
28ea0 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
28eb0 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65  , noLock, isDele
28ec0 74 65 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68  te);.open_finish
28ed0 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
28ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
28ef0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70  qlite3_free(p->p
28f00 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72  Unused);.  }.  r
28f10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
28f20 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
28f30 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
28f40 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
28f50 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
28f60 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
28f70 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
28f80 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
28f90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
28fa0 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  nixDelete(.  sql
28fb0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
28fc0 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f  d,     /* VFS co
28fd0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73  ntaining this as
28fe0 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74   the xDelete met
28ff0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
29000 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
29010 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
29020 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
29030 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e   */.  int dirSyn
29040 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
29050 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e  /* If true, fsyn
29060 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66  c() directory af
29070 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c  ter deleting fil
29080 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
29090 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
290a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
290b0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
290c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
290d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
290e0 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20  _DELETE);.  if( 
290f0 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28  unlink(zPath)==(
29100 2d 31 29 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e  -1) && errno!=EN
29110 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 65 74 75  OENT ){.    retu
29120 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
29130 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
29140 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a  ETE, "unlink", z
29150 50 61 74 68 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Path);.  }.#ifnd
29160 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
29170 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20  E_DIRSYNC.  if( 
29180 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  dirSync ){.    i
29190 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20  nt fd;.    rc = 
291a0 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  openDirectory(zP
291b0 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69  ath, &fd);.    i
291c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
291d0 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
291e0 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  KS.      if( fsy
291f0 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c  nc(fd)==-1 ).#el
29200 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  se.      if( fsy
29210 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a  nc(fd) ).#endif.
29220 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
29230 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
29240 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
29250 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63  IR_FSYNC, "fsync
29260 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  ", zPath);.     
29270 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f   }.      robust_
29280 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
29290 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
292a0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
292b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
292c0 65 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63  est the existanc
292d0 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70  e of or access p
292e0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69  ermissions of fi
292f0 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a  le zPath. The.**
29300 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20   test performed 
29310 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
29320 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  alue of flags:.*
29330 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
29340 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52  ACCESS_EXISTS: R
29350 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
29360 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20  ile exists.**   
29370 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
29380 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72  READWRITE: Retur
29390 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
293a0 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  is read and writ
293b0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c  able..**     SQL
293c0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f  ITE_ACCESS_READO
293d0 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66  NLY: Return 1 if
293e0 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
293f0 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  dable..**.** Oth
29400 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e  erwise return 0.
29410 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
29420 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c  nixAccess(.  sql
29430 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
29440 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20  d,   /* The VFS 
29450 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
29460 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a  xAccess method *
29470 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
29480 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50  zPath,      /* P
29490 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ath of the file 
294a0 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20  to examine */.  
294b0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
294c0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
294d0 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65  do we want to le
294e0 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50  arn about the zP
294f0 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69  ath file? */.  i
29500 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
29510 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
29520 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68  result boolean h
29530 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
29540 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55  amode = 0;.  UNU
29550 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
29560 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
29570 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
29580 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
29590 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74  CCESS; );.  swit
295a0 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
295b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
295c0 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
295d0 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a    amode = F_OK;.
295e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
295f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
29600 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
29610 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f       amode = W_O
29620 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  K|R_OK;.      br
29630 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
29640 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
29650 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
29660 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
29670 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
29680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
29690 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72  Invalid flags ar
296a0 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20  gument");.  }.  
296b0 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63  *pResOut = (osAc
296c0 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64  cess(zPath, amod
296d0 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c  e)==0);.  if( fl
296e0 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
296f0 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52  SS_EXISTS && *pR
29700 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72  esOut ){.    str
29710 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
29720 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a 50    if( 0==stat(zP
29730 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75  ath, &buf) && bu
29740 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a  f.st_size==0 ){.
29750 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d        *pResOut =
29760 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
29770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29780 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  ;.}.../*.** Turn
29790 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
297a0 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
297b0 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
297c0 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
297d0 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
297e0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
297f0 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
29800 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
29810 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
29820 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
29830 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
29840 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
29850 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
29860 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
29870 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
29880 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
29890 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
298a0 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
298b0 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
298c0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
298d0 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
298e0 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
298f0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
29900 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
29910 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
29920 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
29930 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
29940 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
29950 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
29960 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
29970 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
29980 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
29990 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
299a0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
299b0 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
299c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
299d0 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
299e0 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ){..  /* It's od
299f0 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
29a00 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
29a10 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
29a20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
29a30 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
29a40 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
29a50 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
29a60 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
29a70 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
29a80 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
29a90 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
29aa0 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
29ab0 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
29ac0 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
29ad0 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
29ae0 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
29af0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
29b00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
29b10 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  OR );..  assert(
29b20 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
29b30 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e==MAX_PATHNAME 
29b40 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
29b50 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
29b60 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27  zOut[nOut-1] = '
29b70 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  \0';.  if( zPath
29b80 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]=='/' ){.    
29b90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
29ba0 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73  (nOut, zOut, "%s
29bb0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  ", zPath);.  }el
29bc0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64  se{.    int nCwd
29bd0 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63  ;.    if( osGetc
29be0 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29  wd(zOut, nOut-1)
29bf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
29c00 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
29c10 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
29c20 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c  _BKPT, "getcwd",
29c30 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20   zPath);.    }. 
29c40 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73     nCwd = (int)s
29c50 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20  trlen(zOut);.   
29c60 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
29c70 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f  f(nOut-nCwd, &zO
29c80 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c  ut[nCwd], "/%s",
29c90 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72   zPath);.  }.  r
29ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29cb0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
29cc0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
29cd0 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
29ce0 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
29cf0 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
29d00 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
29d10 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
29d20 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
29d30 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
29d40 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
29d50 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e   library..*/.#in
29d60 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a  clude <dlfcn.h>.
29d70 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69  static void *uni
29d80 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  xDlOpen(sqlite3_
29d90 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f  vfs *NotUsed, co
29da0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
29db0 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ame){.  UNUSED_P
29dc0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
29dd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70  );.  return dlop
29de0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54  en(zFilename, RT
29df0 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c  LD_NOW | RTLD_GL
29e00 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OBAL);.}../*.** 
29e10 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
29e20 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64  s function immed
29e30 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63  iately after a c
29e40 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d  all to unixDlSym
29e50 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f  () or.** unixDlO
29e60 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74  pen() fails (ret
29e70 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  urns a null poin
29e80 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20  ter). If a more 
29e90 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a  detailed error.*
29ea0 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61  * message is ava
29eb0 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72  ilable, it is wr
29ec0 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74  itten to zBufOut
29ed0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65  . If no error me
29ee0 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69  ssage.** is avai
29ef0 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69  lable, zBufOut i
29f00 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
29f10 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65  d and SQLite use
29f20 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65  s a default.** e
29f30 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
29f40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
29f50 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  xDlError(sqlite3
29f60 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
29f70 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
29f80 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74  BufOut){.  const
29f90 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55   char *zErr;.  U
29fa0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29fb0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78  NotUsed);.  unix
29fc0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
29fd0 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29  zErr = dlerror()
29fe0 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
29ff0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2a000 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f  intf(nBuf, zBufO
2a010 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b  ut, "%s", zErr);
2a020 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
2a030 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69  Mutex();.}.stati
2a040 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53  c void (*unixDlS
2a050 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
2a060 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
2a070 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79  , const char*zSy
2a080 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20  m))(void){.  /* 
2a090 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d  .  ** GCC with -
2a0a0 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20  pedantic-errors 
2a0b0 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f  says that C90 do
2a0c0 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76  es not allow a v
2a0d0 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20  oid* to be.  ** 
2a0e0 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e  cast into a poin
2a0f0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2a100 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20  n.  And yet the 
2a110 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20  library dlsym() 
2a120 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74  routine.  ** ret
2a130 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69  urns a void* whi
2a140 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70  ch is really a p
2a150 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
2a160 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f  tion.  So how do
2a170 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73   we.  ** use dls
2a180 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e  ym() with -pedan
2a190 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a  tic-errors?.  **
2a1a0 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78  .  ** Variable x
2a1b0 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65   below is define
2a1c0 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65  d to be a pointe
2a1d0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
2a1e0 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61  taking.  ** para
2a1f0 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64  meters void* and
2a200 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64   const char* and
2a210 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69   returning a poi
2a220 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
2a230 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74  on..  ** We init
2a240 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69  ialize x by assi
2a250 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74  gning it a point
2a260 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28  er to the dlsym(
2a270 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ) function..  **
2a280 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e   (That assignmen
2a290 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73  t requires a cas
2a2a0 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c  t.)  Then we cal
2a2b0 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74  l the function t
2a2c0 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74  hat.  ** x point
2a2d0 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  s to.  .  **.  *
2a2e0 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75  * This work-arou
2a2f0 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74  nd is unlikely t
2a300 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  o work correctly
2a310 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77   on any system w
2a320 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65  here.  ** you re
2a330 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74  ally cannot cast
2a340 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
2a350 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20  ter into void*. 
2a360 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68   But then, on th
2a370 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e  e.  ** other han
2a380 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20  d, dlsym() will 
2a390 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68  not work on such
2a3a0 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72   a system either
2a3b0 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a  , so we have.  *
2a3c0 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73  * not really los
2a3d0 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  t anything..  */
2a3e0 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76  .  void (*(*x)(v
2a3f0 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
2a400 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53  ))(void);.  UNUS
2a410 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2a420 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f  Used);.  x = (vo
2a430 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f  id(*(*)(void*,co
2a440 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
2a450 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72  ))dlsym;.  retur
2a460 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b  n (*x)(p, zSym);
2a470 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
2a480 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  nixDlClose(sqlit
2a490 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2a4a0 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
2a4b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2a4c0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2a4d0 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29  dlclose(pHandle)
2a4e0 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
2a4f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
2a500 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
2a510 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
2a520 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20  ine unixDlOpen  
2a530 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
2a540 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
2a550 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20  ine unixDlSym   
2a560 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
2a570 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
2a580 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42  ../*.** Write nB
2a590 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
2a5a0 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73  om data to the s
2a5b0 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a  upplied buffer z
2a5c0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
2a5d0 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73  nt unixRandomnes
2a5e0 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  s(sqlite3_vfs *N
2a5f0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
2a600 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2a610 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2a620 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73  R(NotUsed);.  as
2a630 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75  sert((size_t)nBu
2a640 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f  f>=(sizeof(time_
2a650 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29  t)+sizeof(int)))
2a660 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  ;..  /* We have 
2a670 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42  to initialize zB
2a680 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61  uf to prevent va
2a690 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f  lgrind from repo
2a6a0 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72  rting.  ** error
2a6b0 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20  s.  The reports 
2a6c0 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69  issued by valgri
2a6d0 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  nd are incorrect
2a6e0 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a   - we would.  **
2a6f0 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65   prefer that the
2a700 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69   randomness be i
2a710 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69  ncreased by maki
2a720 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20  ng use of the.  
2a730 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
2a740 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d   space in zBuf -
2a750 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72   but valgrind er
2a760 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72  rors tend to wor
2a770 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65  ry.  ** some use
2a780 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e  rs.  Rather than
2a790 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73   argue, it seems
2a7a0 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20   easier just to 
2a7b0 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  initialize.  ** 
2a7c0 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20  the whole array 
2a7d0 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67  and silence valg
2a7e0 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68  rind, even if th
2a7f0 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61  at means less ra
2a800 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e  ndomness.  ** in
2a810 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64   the random seed
2a820 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
2a830 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61   testing, initia
2a840 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f  lizing zBuf[] to
2a850 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20   zero is all we 
2a860 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a  do.  That means.
2a870 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77    ** that we alw
2a880 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
2a890 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
2a8a0 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d  equence.  This m
2a8b0 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
2a8c0 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
2a8d0 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42    */.  memset(zB
2a8e0 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69  uf, 0, nBuf);.#i
2a8f0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2a900 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
2a910 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20  int pid, fd;.   
2a920 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2a930 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22  n("/dev/urandom"
2a940 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a  , O_RDONLY, 0);.
2a950 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
2a960 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a        time_t t;.
2a970 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a        time(&t);.
2a980 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
2a990 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29  f, &t, sizeof(t)
2a9a0 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67  );.      pid = g
2a9b0 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d  etpid();.      m
2a9c0 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
2a9d0 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69  of(t)], &pid, si
2a9e0 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
2a9f0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
2aa00 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c  (t)+sizeof(pid)<
2aa10 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b  =(size_t)nBuf );
2aa20 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69  .      nBuf = si
2aa30 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66  zeof(t) + sizeof
2aa40 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pid);.    }else
2aa50 7b 0a 20 20 20 20 20 20 64 6f 7b 20 6e 42 75 66  {.      do{ nBuf
2aa60 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42   = osRead(fd, zB
2aa70 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c  uf, nBuf); }whil
2aa80 65 28 20 6e 42 75 66 3c 30 20 26 26 20 65 72 72  e( nBuf<0 && err
2aa90 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
2aaa0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2aab0 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  0, fd, __LINE__)
2aac0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2aad0 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66  if.  return nBuf
2aae0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
2aaf0 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
2ab00 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
2ab10 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
2ab20 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
2ab30 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
2ab40 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
2ab50 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
2ab60 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72   sleep..** The r
2ab70 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
2ab80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
2ab90 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65  roseconds of sle
2aba0 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72  ep actually.** r
2abb0 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
2abc0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65  e underlying ope
2abd0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61  rating system, a
2abe0 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a   number which.**
2abf0 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65   might be greate
2ac00 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
2ac10 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  to the argument,
2ac20 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a   but not less.**
2ac30 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65   than the argume
2ac40 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
2ac50 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69  t unixSleep(sqli
2ac60 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2ac70 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e  , int microsecon
2ac80 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ds){.#if OS_VXWO
2ac90 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
2aca0 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e  espec sp;..  sp.
2acb0 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65  tv_sec = microse
2acc0 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b  conds / 1000000;
2acd0 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20  .  sp.tv_nsec = 
2ace0 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20  (microseconds % 
2acf0 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b  1000000) * 1000;
2ad00 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70  .  nanosleep(&sp
2ad10 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45  , NULL);.  UNUSE
2ad20 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2ad30 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
2ad40 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
2ad50 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
2ad60 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
2ad70 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28  USLEEP.  usleep(
2ad80 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20  microseconds);. 
2ad90 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2ada0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
2adb0 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
2adc0 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  s;.#else.  int s
2add0 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73  econds = (micros
2ade0 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31  econds+999999)/1
2adf0 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28  000000;.  sleep(
2ae00 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
2ae10 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2ae20 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
2ae30 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b  seconds*1000000;
2ae40 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
2ae50 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2ae60 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
2ae70 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
2ae80 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
2ae90 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
2aea0 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
2aeb0 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
2aec0 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
2aed0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
2aee0 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
2aef0 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
2af00 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
2af10 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
2af20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2af30 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
2af40 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
2af50 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
2af60 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
2af70 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2af80 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2af90 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2afa0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2afb0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2afc0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2afd0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2afe0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2aff0 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
2b000 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
2b010 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
2b020 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
2b030 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
2b040 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
2b050 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
2b060 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
2b070 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
2b080 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
2b090 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2b0a0 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
2b0b0 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
2b0c0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
2b0d0 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52  ss, return 0.  R
2b0e0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
2b0f0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
2b100 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
2b110 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2b120 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2b130 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2b140 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69  tUsed, sqlite3_i
2b150 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
2b160 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2b170 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
2b180 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
2b190 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
2b1a0 36 34 30 30 30 30 3b 0a 23 69 66 20 64 65 66 69  640000;.#if defi
2b1b0 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
2b1c0 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
2b1d0 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  e(&t);.  *piNow 
2b1e0 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ((sqlite3_int6
2b1f0 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78  4)t)*1000 + unix
2b200 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f  Epoch;.#elif OS_
2b210 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
2b220 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a   timespec sNow;.
2b230 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28    clock_gettime(
2b240 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20  CLOCK_REALTIME, 
2b250 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77  &sNow);.  *piNow
2b260 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
2b270 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
2b280 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
2b290 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30   sNow.tv_nsec/10
2b2a0 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73  00000;.#else.  s
2b2b0 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
2b2c0 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64  ow;.  gettimeofd
2b2d0 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20  ay(&sNow, 0);.  
2b2e0 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
2b2f0 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
2b300 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
2b310 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75  _sec + sNow.tv_u
2b320 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66  sec/1000;.#endif
2b330 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2b340 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
2b350 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2b360 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
2b370 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2b380 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
2b390 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
2b3a0 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
2b3b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2b3c0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2b3d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2b3e0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
2b3f0 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
2b400 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
2b410 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
2b420 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
2b430 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2b440 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2b450 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
2b460 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
2b470 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
2b480 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
2b490 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2b4a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b4b0 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28  unixCurrentTime(
2b4c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2b4d0 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72  Used, double *pr
2b4e0 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Now){.  sqlite3_
2b4f0 69 6e 74 36 34 20 69 3b 0a 20 20 55 4e 55 53 45  int64 i;.  UNUSE
2b500 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2b510 73 65 64 29 3b 0a 20 20 75 6e 69 78 43 75 72 72  sed);.  unixCurr
2b520 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20  entTimeInt64(0, 
2b530 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20  &i);.  *prNow = 
2b540 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
2b550 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2b560 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20  ** We added the 
2b570 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  xGetLastError() 
2b580 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20  method with the 
2b590 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f  intention of pro
2b5a0 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72  viding.** better
2b5b0 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
2b5c0 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f   messages when o
2b5d0 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
2b5e0 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
2b5f0 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
2b600 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  e operation.  Bu
2b610 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f  t so far, none o
2b620 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  f that has been 
2b630 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69  implemented.** i
2b640 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20  n the core.  So 
2b650 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2b660 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46  never called.  F
2b670 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65  or now, it is me
2b680 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d  rely.** a place-
2b690 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  holder..*/.stati
2b6a0 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73  c int unixGetLas
2b6b0 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
2b6c0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
2b6d0 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20   NotUsed2, char 
2b6e0 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e  *NotUsed3){.  UN
2b6f0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2b700 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45  otUsed);.  UNUSE
2b710 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2b720 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  sed2);.  UNUSED_
2b730 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2b740 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  d3);.  return 0;
2b750 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../*.********
2b760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b770 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f   End of sqlite3_
2b780 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
2b790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b7a0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
2b7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b7d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b7f0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
2b800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b840 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
2b850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b860 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20  *** Begin Proxy 
2b870 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
2b880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b890 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
2b8a0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2b8b0 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d  a "uber-locking-
2b8c0 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20  method" in this 
2b8d0 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20  sense:  It uses 
2b8e0 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63  the.** other loc
2b8f0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
2b900 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66  secondary lock f
2b910 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63  iles.  Proxy loc
2b920 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74  king is a.** met
2b930 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70  a-layer over top
2b940 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76   of the primitiv
2b950 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
2b960 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f  ented above.  Fo
2b970 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e  r.** this reason
2b980 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
2b990 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f  hat implements o
2b9a0 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
2b9b0 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75  is deferred.** u
2b9c0 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65  ntil late in the
2b9d0 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74   file (here) aft
2b9e0 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74  er all of the ot
2b9f0 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  her I/O methods 
2ba00 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66  have.** been def
2ba10 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74  ined - so that t
2ba20 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
2ba30 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65  king methods are
2ba40 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73   available.** as
2ba50 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c   services to hel
2ba60 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65  p with the imple
2ba70 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f  mentation of pro
2ba80 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  xy locking..**.*
2ba90 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ***.**.** The de
2baa0 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63  fault locking sc
2bab0 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20  hemes in SQLite 
2bac0 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  use byte-range l
2bad0 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ocks on the.** d
2bae0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2baf0 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c  coordinate safe,
2bb00 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65   concurrent acce
2bb10 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72  ss by multiple r
2bb20 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72  eaders.** and wr
2bb30 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71  iters [http://sq
2bb40 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67  lite.org/locking
2bb50 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66  v3.html].  The f
2bb60 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ive file locking
2bb70 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f  .** states (UNLO
2bb80 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53  CKED, PENDING, S
2bb90 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
2bba0 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20   EXCLUSIVE) are 
2bbb0 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61  implemented.** a
2bbc0 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77  s POSIX read & w
2bbd0 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20  rite locks over 
2bbe0 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63  fixed set of loc
2bbf0 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74  ations (via fsct
2bc00 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e  l),.** on AFP an
2bc10 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75  d SMB only exclu
2bc20 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20  sive byte-range 
2bc30 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61  locks are availa
2bc40 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a  ble via fsctl.**
2bc50 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c   with _IOWR('z',
2bc60 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
2bc70 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f  RangeLockPB2) to
2bc80 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20   track the same 
2bc90 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20  5 states..** To 
2bca0 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c  simulate a F_RDL
2bcb0 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  CK on the shared
2bcc0 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61   range, on AFP a
2bcd0 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74   randomly select
2bce0 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e  ed.** address in
2bcf0 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
2bd00 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
2bd10 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
2bd20 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72  e entire.** shar
2bd30 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
2bd40 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49  n for an EXCLUSI
2bd50 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20  VE lock):.**.** 
2bd60 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
2bd70 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
2bd80 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20  000..   ..**    
2bd90 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20    RESERVED_BYTE 
2bda0 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31        0x40000001
2bdb0 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f  .**      SHARED_
2bdc0 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34  RANGE        0x4
2bdd0 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30  0000002 -> 0x400
2bde0 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73  00200.**.** This
2bdf0 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74   works well on t
2be00 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
2be10 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20  stem, but shows 
2be20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a  a nearly 100x.**
2be30 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61   slowdown in rea
2be40 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e  d performance on
2be50 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65   AFP because the
2be60 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61   AFP client disa
2be70 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64  bles.** the read
2be80 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65   cache when byte
2be90 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
2bea0 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c   present.  Enabl
2beb0 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20  ing the read.** 
2bec0 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20  cache exposes a 
2bed0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
2bee0 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20  problem that is 
2bef0 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f  present on all O
2bf00 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64  S X.** supported
2bf10 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79   network file sy
2bf20 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20  stems.  NFS and 
2bf30 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65  AFP both observe
2bf40 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f   the.** close-to
2bf50 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20  -open semantics 
2bf60 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63  for ensuring cac
2bf70 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20  he coherency.** 
2bf80 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72  [http://nfs.sour
2bf90 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71  ceforge.net/#faq
2bfa0 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73  _a8], which does
2bfb0 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79   not effectively
2bfc0 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20  .** address the 
2bfd0 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72  requirements for
2bfe0 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61   concurrent data
2bff0 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d  base access by m
2c000 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65  ultiple.** reade
2c010 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a  rs and writers.*
2c020 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61  * [http://www.na
2c030 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d  bble.com/SQLite-
2c040 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68  on-NFS-cache-coh
2c050 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30  erency-td1565570
2c060 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54  1.html]..**.** T
2c070 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65  o address the pe
2c080 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61  rformance and ca
2c090 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73  che coherency is
2c0a0 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65  sues, proxy file
2c0b0 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e   locking.** chan
2c0c0 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61  ges the way data
2c0d0 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63  base access is c
2c0e0 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d  ontrolled by lim
2c0f0 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20  iting access to 
2c100 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74  a.** single host
2c110 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d   at a time and m
2c120 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  oving file locks
2c130 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61   off of the data
2c140 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  base file.** and
2c150 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69   onto a proxy fi
2c160 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  le on the local 
2c170 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a  file system.  .*
2c180 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72  *.**.** Using pr
2c190 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d  oxy locks.** ---
2c1a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
2c1b0 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a  *.** C APIs.**.*
2c1c0 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
2c1d0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
2c1e0 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  me, SQLITE_SET_L
2c1f0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a  OCKPROXYFILE,.**
2c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c210 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61         <proxy_pa
2c220 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b  th> | ":auto:");
2c230 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
2c240 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
2c250 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54  name, SQLITE_GET
2c260 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
2c270 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a  &<proxy_path>);.
2c280 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61  **.**.** SQL pra
2c290 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47  gmas.**.**  PRAG
2c2a0 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
2c2b0 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70  ck_proxy_file=<p
2c2c0 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75  roxy_path> | :au
2c2d0 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  to:.**  PRAGMA [
2c2e0 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
2c2f0 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20  roxy_file.**.** 
2c300 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74  Specifying ":aut
2c310 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69  o:" means that i
2c320 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e  f there is a con
2c330 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d  ch file with a m
2c340 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20  atching.** host 
2c350 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72  ID in it, the pr
2c360 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20  oxy path in the 
2c370 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20  conch file will 
2c380 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69  be used, otherwi
2c390 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61  se.** a proxy pa
2c3a0 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  th based on the 
2c3b0 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a  user's temp dir.
2c3c0 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28  ** (via confstr(
2c3d0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
2c3e0 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77  TEMP_DIR,...)) w
2c3f0 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20  ill be used and 
2c400 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72  the.** actual pr
2c410 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  oxy file name is
2c420 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
2c430 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74  the name and pat
2c440 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  h of the.** data
2c450 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20  base file.  For 
2c460 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
2c470 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73       For databas
2c480 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d  e path "/Users/m
2c490 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20  e/foo.db" .**   
2c4a0 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74      The lock pat
2c4b0 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64  h will be "<tmpd
2c4c0 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73  ir>/sqliteplocks
2c4d0 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64  /_Users_me_foo.d
2c4e0 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20  b:auto:").**.** 
2c4f0 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78  Once a lock prox
2c500 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  y is configured 
2c510 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
2c520 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61  onnection, it ca
2c530 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f  n not.** be remo
2c540 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20  ved, however it 
2c550 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20  may be switched 
2c560 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
2c570 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a  roxy path via.**
2c580 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20   the above APIs 
2c590 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f  (assuming the co
2c5a0 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nch file is not 
2c5b0 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e  being held by an
2c5c0 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74  other.** connect
2c5d0 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e  ion or process).
2c5e0 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70   .**.**.** How p
2c5f0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  roxy locking wor
2c600 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
2c610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
2c620 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c  .** Proxy file l
2c630 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72  ocking relies pr
2c640 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e  imarily on two n
2c650 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69  ew supporting fi
2c660 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  les: .**.**   * 
2c670 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c   conch file to l
2c680 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74  imit access to t
2c690 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c6a0 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73   to a single hos
2c6b0 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74  t.**      at a t
2c6c0 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70  ime.**.**   *  p
2c6d0 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74  roxy file to act
2c6e0 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20   as a proxy for 
2c6f0 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  the advisory loc
2c700 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20  ks normally.**  
2c710 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65      taken on the
2c720 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20   database.**.** 
2c730 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d  The conch file -
2c740 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20   to use a proxy 
2c750 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73  file, sqlite mus
2c760 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68  t first "hold th
2c770 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74  e conch".** by t
2c780 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d  aking an sqlite-
2c790 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63  style shared loc
2c7a0 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  k on the conch f
2c7b0 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65  ile, reading the
2c7c0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64  .** contents and
2c7d0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68   comparing the h
2c7e0 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73  ost's unique hos
2c7f0 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29  t ID (see below)
2c800 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f   and lock.** pro
2c810 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20  xy path against 
2c820 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
2c830 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20  d in the conch. 
2c840 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
2c850 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  is.** stored in 
2c860 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
2c870 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ry as the databa
2c880 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
2c890 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20  file name.** is 
2c8a0 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20  patterned after 
2c8b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c8c0 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74  e name as ".<dat
2c8d0 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68  abasename>-conch
2c8e0 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  "..** If the con
2c8f0 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  ch file does not
2c900 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20   exist, or it's 
2c910 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20  contents do not 
2c920 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73  match the.** hos
2c930 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78  t ID and/or prox
2c940 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65  y path, then the
2c950 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74   lock is escalat
2c960 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69  ed to an exclusi
2c970 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74  ve.** lock and t
2c980 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
2c990 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65  ntents is update
2c9a0 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20  d with the host 
2c9b0 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20  ID and proxy.** 
2c9c0 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63  path and the loc
2c9d0 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20  k is downgraded 
2c9e0 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
2c9f0 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20   again.  If the 
2ca00 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64  conch.** is held
2ca10 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   by another proc
2ca20 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72  ess (with a shar
2ca30 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78  ed lock), the ex
2ca40 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
2ca50 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51  will fail and SQ
2ca60 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
2ca70 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
2ca80 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20   proxy file - a 
2ca90 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65  single-byte file
2caa0 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64   used for all ad
2cab0 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b  visory file lock
2cac0 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61  s.** normally ta
2cad0 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
2cae0 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73  ase file.   This
2caf0 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65   allows for safe
2cb00 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74   sharing.** of t
2cb10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cb20 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65   for multiple re
2cb30 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
2cb40 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
2cb50 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68   host (the conch
2cb60 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
2cb70 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73  ey all use the s
2cb80 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  ame local lock f
2cb90 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75  ile)..**.** Requ
2cba0 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  esting the lock 
2cbb0 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69  proxy does not i
2cbc0 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20  mmediately take 
2cbd0 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73  the conch, it is
2cbe0 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77  .** only taken w
2cbf0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65  hen the first re
2cc00 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61  quest to lock da
2cc10 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
2cc20 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d  ade.  .** This m
2cc30 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e  atches the seman
2cc40 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64  tics of the trad
2cc50 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  itional locking 
2cc60 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a  behavior, where.
2cc70 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e  ** opening a con
2cc80 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74  nection to a dat
2cc90 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20  abase file does 
2cca0 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20  not take a lock 
2ccb0 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68  on it..** The sh
2ccc0 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e  ared lock and an
2ccd0 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   open file descr
2cce0 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61  iptor are mainta
2ccf0 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74  ined until .** t
2cd00 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
2cd10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2cd20 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   closed. .**.** 
2cd30 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61  The proxy file a
2cd40 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  nd the lock file
2cd50 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74   are never delet
2cd60 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20  ed so they only 
2cd70 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72  need.** to be cr
2cd80 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20  eated the first 
2cd90 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73  time they are us
2cda0 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67  ed..**.** Config
2cdb0 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a  uration options.
2cdc0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
2cdd0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20  --------.**.**  
2cde0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2cdf0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a  OXY_LOCKING.**.*
2ce00 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65  *       Database
2ce10 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20   files accessed 
2ce20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  on non-local fil
2ce30 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a  e systems are.**
2ce40 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63         automatic
2ce50 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ally configured 
2ce60 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
2ce70 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72  g, lock files ar
2ce80 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64  e.**       named
2ce90 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75   automatically u
2cea0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f  sing the same lo
2ceb0 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20  gic as.**       
2cec0 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78  PRAGMA lock_prox
2ced0 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a  y_file=":auto:".
2cee0 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54  **    .**  SQLIT
2cef0 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a  E_PROXY_DEBUG.**
2cf00 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65  .**       Enable
2cf10 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66  s the logging of
2cf20 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
2cf30 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66  during host id f
2cf40 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74  ile.**       ret
2cf50 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74  rieval and creat
2cf60 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50  ion.**.**  LOCKP
2cf70 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20  ROXYDIR.**.**   
2cf80 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68      Overrides th
2cf90 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74  e default direct
2cfa0 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
2cfb0 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68  k proxy files th
2cfc0 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20  at.**       are 
2cfd0 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
2cfe0 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75  lly via the ":au
2cff0 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a  to:" setting.**.
2d000 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55  **  SQLITE_DEFAU
2d010 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
2d020 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20  ISSIONS.**.**   
2d030 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20      Permissions 
2d040 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61  to use when crea
2d050 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ting a directory
2d060 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65   for storing the
2d070 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70  .**       lock p
2d080 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79  roxy files, only
2d090 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50   used when LOCKP
2d0a0 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73  ROXYDIR is not s
2d0b0 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20  et..**    .**   
2d0c0 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65   .** As mentione
2d0d0 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f  d above, when co
2d0e0 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
2d0f0 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2d100 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74  LOCKING,.** sett
2d110 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d  ing the environm
2d120 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c  ent variable SQL
2d130 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
2d140 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c  LOCKING to 1 wil
2d150 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79  l.** force proxy
2d160 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75   locking to be u
2d170 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61  sed for every da
2d180 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
2d190 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c  ed, and 0.** wil
2d1a0 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69  l force automati
2d1b0 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  c proxy locking 
2d1c0 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66  to be disabled f
2d1d0 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
2d1e0 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63  ** files (explic
2d1f0 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20  ity calling the 
2d200 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
2d210 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20  ROXYFILE pragma 
2d220 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c  or.** sqlite_fil
2d230 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73  e_control API is
2d240 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79   not affected by
2d250 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
2d260 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f  OXY_LOCKING)..*/
2d270 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  ../*.** Proxy lo
2d280 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
2d290 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53  ailable on MacOS
2d2a0 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  X .*/.#if define
2d2b0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2d2c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2d2d0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a  CKING_STYLE../*.
2d2e0 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b  ** The proxyLock
2d2f0 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74  ingContext has t
2d300 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65  he path and file
2d310 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
2d320 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61  the remote .** a
2d330 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66  nd local proxy f
2d340 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79  iles in it.*/.ty
2d350 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f  pedef struct pro
2d360 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2d370 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2d380 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f  text;.struct pro
2d390 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2d3a0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63   {.  unixFile *c
2d3b0 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20  onchFile;       
2d3c0 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20    /* Open conch 
2d3d0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2d3e0 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20  conchFilePath;  
2d3f0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2d400 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
2d410 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
2d420 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20  lockProxy;      
2d430 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79     /* Open proxy
2d440 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
2d450 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50  char *lockProxyP
2d460 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ath;         /* 
2d470 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78  Name of the prox
2d480 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
2d490 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
2d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d4b0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
2d4c0 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  n file */.  int 
2d4d0 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20  conchHeld;      
2d4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66           /* 1 if
2d4f0 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65   the conch is he
2d500 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65  ld, -1 if lockle
2d510 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c  ss */.  void *ol
2d520 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
2d530 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
2d540 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20   lockingcontext 
2d550 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c  to restore on cl
2d560 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ose */.  sqlite3
2d570 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
2d580 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20  t *pOldMethod;  
2d590 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49     /* Original I
2d5a0 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63  /O methods for c
2d5b0 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a  lose */.};../* .
2d5c0 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
2d5d0 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20  k file path for 
2d5e0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
2d5f0 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65  dbPath is writte
2d600 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a  n into lPath, .*
2d610 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69  * which must poi
2d620 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69  nt to valid, wri
2d630 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72  table memory lar
2d640 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20  ge enough for a 
2d650 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a  maxLen length.**
2d660 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a   file path. .*/.
2d670 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2d680 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  GetLockPath(cons
2d690 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  t char *dbPath, 
2d6a0 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a  char *lPath, siz
2d6b0 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69  e_t maxLen){.  i
2d6c0 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62  nt len;.  int db
2d6d0 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  Len;.  int i;..#
2d6e0 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44  ifdef LOCKPROXYD
2d6f0 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  IR.  len = strlc
2d700 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52  py(lPath, LOCKPR
2d710 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b  OXYDIR, maxLen);
2d720 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f  .#else.# ifdef _
2d730 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
2d740 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20  EMP_DIR.  {.    
2d750 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53  if( !confstr(_CS
2d760 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
2d770 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61  P_DIR, lPath, ma
2d780 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f  xLen) ){.      O
2d790 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
2d7a0 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20  PATH  failed %s 
2d7b0 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c  errno=%d pid=%d\
2d7c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2d7d0 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c     lPath, errno,
2d7e0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20   getpid()));.   
2d7f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d800 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
2d810 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72   }.    len = str
2d820 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c  lcat(lPath, "sql
2d830 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c  iteplocks", maxL
2d840 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65  en);    .  }.# e
2d850 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  lse.  len = strl
2d860 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70  cpy(lPath, "/tmp
2d870 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65  /", maxLen);.# e
2d880 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ndif.#endif..  i
2d890 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21  f( lPath[len-1]!
2d8a0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20  ='/' ){.    len 
2d8b0 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
2d8c0 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20   "/", maxLen);. 
2d8d0 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73   }.  .  /* trans
2d8e0 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68  form the db path
2d8f0 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63   to a unique cac
2d900 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c  he name */.  dbL
2d910 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
2d920 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
2d930 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
2d940 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29   (i+len+7)<(int)
2d950 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  maxLen; i++){.  
2d960 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74    char c = dbPat
2d970 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b  h[i];.    lPath[
2d980 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27  i+len] = (c=='/'
2d990 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c  )?'_':c;.  }.  l
2d9a0 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27  Path[i+len]='\0'
2d9b0 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74  ;.  strlcat(lPat
2d9c0 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78  h, ":auto:", max
2d9d0 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Len);.  OSTRACE(
2d9e0 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70  ("GETLOCKPATH  p
2d9f0 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
2da00 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61  s pid=%d\n", lPa
2da10 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
2da20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2da30 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43  OK;.}../* . ** C
2da40 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20  reates the lock 
2da50 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73  file and any mis
2da60 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  sing directories
2da70 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f   in lockPath. */
2da80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2da90 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
2daa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b  const char *lock
2dab0 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Path){.  int i, 
2dac0 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  len;.  char buf[
2dad0 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69  MAXPATHLEN];.  i
2dae0 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
2daf0 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61  .  assert(lockPa
2db00 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20  th!=NULL);.  /* 
2db10 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c  try to create al
2db20 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  l the intermedia
2db30 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a  te directories *
2db40 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73  /.  len = (int)s
2db50 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b  trlen(lockPath);
2db60 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b  .  buf[0] = lock
2db70 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20  Path[0];.  for( 
2db80 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20  i=1; i<len; i++ 
2db90 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  ){.    if( lockP
2dba0 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26  ath[i] == '/' &&
2dbb0 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29   (i - start > 0)
2dbc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c   ){.      /* onl
2dbd0 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20  y mkdir if leaf 
2dbe0 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f  dir != "." or "/
2dbf0 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20  " or ".." */.   
2dc00 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32     if( i-start>2
2dc10 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20   || (i-start==1 
2dc20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
2dc30 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72   '.' && buf[star
2dc40 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20  t] != '/') .    
2dc50 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74       || (i-start
2dc60 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==2 && buf[start
2dc70 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
2dc80 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29  start+1] != '.')
2dc90 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   ){.        buf[
2dca0 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20  i]='\0';.       
2dcb0 20 69 66 28 20 6d 6b 64 69 72 28 62 75 66 2c 20   if( mkdir(buf, 
2dcc0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2dcd0 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
2dce0 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ONS) ){.        
2dcf0 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
2dd00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
2dd10 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20  rr!=EEXIST ) {. 
2dd20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
2dd30 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
2dd40 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61  ATH  FAILED crea
2dd50 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20  ting %s, ".     
2dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd70 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b  "'%s' proxy lock
2dd80 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
2dd90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2dda0 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74           buf, st
2ddb0 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63  rerror(err), loc
2ddc0 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29  kPath, getpid())
2ddd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
2dde0 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20  eturn err;.     
2ddf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2de00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2de10 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a  tart=i+1;.    }.
2de20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63      buf[i] = loc
2de30 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20  kPath[i];.  }.  
2de40 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
2de50 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
2de60 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
2de70 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68  =%d\n", lockPath
2de80 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
2de90 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2dea0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
2deb0 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70  VFS file descrip
2dec0 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d  tor (stored in m
2ded0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
2dee0 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
2def0 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20  alloc) and open 
2df00 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  the file named "
2df10 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c  path" in the fil
2df20 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
2df30 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
2df40 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f  s responsible no
2df50 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69  t only for closi
2df60 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ng the file desc
2df70 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c  riptor.** but al
2df80 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  so for freeing t
2df90 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  he memory associ
2dfa0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
2dfb0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
2dfc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2dfd0 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
2dfe0 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  (.    const char
2dff0 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f   *path,        /
2e000 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e  * path for the n
2e010 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  ew unixFile */. 
2e020 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70     unixFile **pp
2e030 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75  File,       /* u
2e040 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20  nixFile created 
2e050 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  and returned by 
2e060 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ref */.    int i
2e070 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20  slockfile       
2e080 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65      /* if non ze
2e090 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20  ro missing dirs 
2e0a0 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
2e0b0 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20  */.) {.  int fd 
2e0c0 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69 72 66  = -1;.  int dirf
2e0d0 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69  d = -1;.  unixFi
2e0e0 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  le *pNew;.  int 
2e0f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e100 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
2e110 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
2e120 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  AT;.  sqlite3_vf
2e130 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e  s dummyVfs;.  in
2e140 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  t terrno = 0;.  
2e150 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
2e160 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  nused = NULL;.. 
2e170 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79   /* 1. first try
2e180 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
2e190 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e  the file.  ** 2.
2e1a0 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
2e1b0 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f  and this is a lo
2e1c0 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e  ck file (not-con
2e1d0 63 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e  ch), try creatin
2e1e0 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e  g.  ** the paren
2e1f0 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e  t directories an
2e200 64 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e  d then try again
2e210 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61  ..  ** 3. if tha
2e220 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20  t fails, try to 
2e230 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65  open the file re
2e240 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68  ad-only.  ** oth
2e250 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55  erwise return BU
2e260 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65  SY (if lock file
2e270 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f  ) or CANTOPEN fo
2e280 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  r the conch file
2e290 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20  .  */.  pUnused 
2e2a0 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
2e2b0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2e2c0 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64  );.  if( pUnused
2e2d0 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e   ){.    fd = pUn
2e2e0 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73  used->fd;.  }els
2e2f0 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  e{.    pUnused =
2e300 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2e310 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
2e320 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75  );.    if( !pUnu
2e330 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sed ){.      ret
2e340 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2e350 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2e360 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64  ( fd<0 ){.    fd
2e370 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
2e380 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
2e390 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2e3a0 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
2e3b0 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
2e3c0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64  rrno;.    if( fd
2e3d0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  <0 && errno==ENO
2e3e0 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c  ENT && islockfil
2e3f0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
2e400 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
2e410 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49  th(path) == SQLI
2e420 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e430 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2e440 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
2e450 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  s, SQLITE_DEFAUL
2e460 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
2e470 4e 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NS);.      }.   
2e480 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
2e490 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61  0 ){.    openFla
2e4a0 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
2e4b0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2e4c0 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
2e4d0 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
2e4e0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2e4f0 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e  IONS);.    terrn
2e500 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20  o = errno;.  }. 
2e510 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2e520 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20   if( islockfile 
2e530 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2e540 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2e550 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74   }.    switch (t
2e560 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63  errno) {.      c
2e570 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20  ase EACCES:.    
2e580 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e590 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61  E_PERM;.      ca
2e5a0 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20  se EIO: .       
2e5b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2e5c0 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76  OERR_LOCK; /* ev
2e5d0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
2e5e0 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20  the conch */.   
2e5f0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2e600 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e610 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2e620 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
2e630 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
2e640 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
2e650 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  c(sizeof(*pNew))
2e660 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55  ;.  if( pNew==NU
2e670 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  LL ){.    rc = S
2e680 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2e690 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65   goto end_create
2e6a0 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65  _proxy;.  }.  me
2e6b0 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
2e6c0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
2e6d0 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61  .  pNew->openFla
2e6e0 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
2e6f0 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44    dummyVfs.pAppD
2e700 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75  ata = (void*)&au
2e710 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a  tolockIoFinder;.
2e720 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20    pUnused->fd = 
2e730 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  fd;.  pUnused->f
2e740 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
2e750 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65  ;.  pNew->pUnuse
2e760 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a  d = pUnused;.  .
2e770 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
2e780 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c  xFile(&dummyVfs,
2e790 20 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71 6c   fd, dirfd, (sql
2e7a0 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
2e7b0 20 70 61 74 68 2c 20 30 2c 20 30 29 3b 0a 20 20   path, 0, 0);.  
2e7c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e7d0 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
2e7e0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
2e7f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e800 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
2e810 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73  oxy:    .  robus
2e820 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64  t_close(pNew, fd
2e830 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73  , __LINE__);.  s
2e840 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
2e850 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2e860 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65  e(pUnused);.  re
2e870 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
2e880 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
2e890 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
2e8a0 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
2e8b0 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
2e8c0 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
2e8d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f  /.int sqlite3_ho
2e8e0 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65  stid_num = 0;.#e
2e8f0 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52  ndif..#define PR
2e900 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20  OXY_HOSTIDLEN   
2e910 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   16  /* conch fi
2e920 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74  le host id lengt
2e930 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77  h */../* Not alw
2e940 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  ays defined in t
2e950 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69 74  he headers as it
2e960 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a   ought to be */.
2e970 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f  extern int getho
2e980 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69 64  stuuid(uuid_t id
2e990 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74  , const struct t
2e9a0 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a  imespec *wait);.
2e9b0 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74  ./* get the host
2e9c0 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75   ID via gethostu
2e9d0 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d  uid(), pHostID m
2e9e0 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f  ust point to PRO
2e9f0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a  XY_HOSTIDLEN .**
2ea00 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62   bytes of writab
2ea10 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  le memory..*/.st
2ea20 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
2ea30 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64  tHostID(unsigned
2ea40 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20   char *pHostID, 
2ea50 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20  int *pError){.  
2ea60 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53  assert(PROXY_HOS
2ea70 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66  TIDLEN == sizeof
2ea80 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d  (uuid_t));.  mem
2ea90 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20  set(pHostID, 0, 
2eaa0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
2eab0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
2eac0 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAX_OS_X_VERSION
2ead0 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a  _MIN_REQUIRED)\.
2eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2eaf0 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52  & __MAC_OS_X_VER
2eb00 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45  SION_MIN_REQUIRE
2eb10 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20 20 73  D<1050.  {.    s
2eb20 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2eb30 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65  ct timespec time
2eb40 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a  out = {1, 0}; /*
2eb50 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a   1 sec timeout *
2eb60 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f 73  /.    if( gethos
2eb70 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26  tuuid(pHostID, &
2eb80 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20  timeout) ){.    
2eb90 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
2eba0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 72  o;.      if( pEr
2ebb0 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ror ){.        *
2ebc0 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20  pError = err;.  
2ebd0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2ebe0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
2ebf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2ec00 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2ec10 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61  TEST.  /* simula
2ec20 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
2ec30 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
2ec40 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
2ec50 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20   paths */.  if( 
2ec60 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
2ec70 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48  um != 0){.    pH
2ec80 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72  ostID[0] = (char
2ec90 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28  )(pHostID[0] + (
2eca0 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f  char)(sqlite3_ho
2ecb0 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29  stid_num & 0xFF)
2ecc0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2ecd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2ece0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  _OK;.}../* The c
2ecf0 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69  onch file contai
2ed00 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68  ns the header, h
2ed10 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20  ost id and lock 
2ed20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64  file path. */.#d
2ed30 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43  efine PROXY_CONC
2ed40 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20  HVERSION 2   /* 
2ed50 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 31  1-byte header, 1
2ed60 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20  6-byte host id, 
2ed70 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  path */.#define 
2ed80 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20  PROXY_HEADERLEN 
2ed90 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20     1   /* conch 
2eda0 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67  file header leng
2edb0 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
2edc0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20  OXY_PATHINDEX   
2edd0 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
2ede0 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
2edf0 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  N).#define PROXY
2ee00 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50  _MAXCONCHLEN  (P
2ee10 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
2ee20 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d  ROXY_HOSTIDLEN+M
2ee30 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a  AXPATHLEN)../* .
2ee40 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e  ** Takes an open
2ee50 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70   conch file, cop
2ee60 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ies the contents
2ee70 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61   to a new path a
2ee80 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a  nd then moves .*
2ee90 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20  * it back.  The 
2eea0 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 66 69  newly created fi
2eeb0 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63 72 69  le's file descri
2eec0 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64  ptor is assigned
2eed0 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68   to the.** conch
2eee0 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20   file structure 
2eef0 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20  and finally the 
2ef00 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66  original conch f
2ef10 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
2ef20 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52  s .** closed.  R
2ef30 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73  eturns zero if s
2ef40 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74  uccessful..*/.st
2ef50 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72  atic int proxyBr
2ef60 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  eakConchLock(uni
2ef70 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75  xFile *pFile, uu
2ef80 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a  id_t myHostID){.
2ef90 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
2efa0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
2efb0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2efc0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
2efd0 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
2efe0 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
2eff0 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
2f000 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61  File;.  char tPa
2f010 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
2f020 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59    char buf[PROXY
2f030 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
2f040 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70   char *cPath = p
2f050 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
2f060 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61  th;.  size_t rea
2f070 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65  dLen = 0;.  size
2f080 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a  _t pathLen = 0;.
2f090 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34    char errmsg[64
2f0a0 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64  ] = "";.  int fd
2f0b0 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20   = -1;.  int rc 
2f0c0 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50  = -1;.  UNUSED_P
2f0d0 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49  ARAMETER(myHostI
2f0e0 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65  D);..  /* create
2f0f0 20 61 20 6e 65 77 20 70 61 74 68 20 62 79 20 72   a new path by r
2f100 65 70 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c  eplace the trail
2f110 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74  ing '-conch' wit
2f120 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20  h '-break' */.  
2f130 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70  pathLen = strlcp
2f140 79 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20  y(tPath, cPath, 
2f150 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69  MAXPATHLEN);.  i
2f160 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41  f( pathLen>MAXPA
2f170 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e  THLEN || pathLen
2f180 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72  <6 || .     (str
2f190 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61 74 68  lcpy(&tPath[path
2f1a0 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c  Len-5], "break",
2f1b0 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20   6) != 5) ){.   
2f1c0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2f1d0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
2f1e0 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72  ,errmsg,"path er
2f1f0 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69  ror (len %d)",(i
2f200 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20  nt)pathLen);.   
2f210 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
2f220 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65  ock;.  }.  /* re
2f230 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e  ad the conch con
2f240 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65  tent */.  readLe
2f250 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63  n = osPread(conc
2f260 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50  hFile->h, buf, P
2f270 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
2f280 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64  , 0);.  if( read
2f290 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e  Len<PROXY_PATHIN
2f2a0 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DEX ){.    sqlit
2f2b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2f2c0 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73  of(errmsg),errms
2f2d0 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c  g,"read error (l
2f2e0 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61  en %d)",(int)rea
2f2f0 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  dLen);.    goto 
2f300 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
2f310 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74   }.  /* write it
2f320 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70   out to the temp
2f330 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65  orary break file
2f340 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73   */.  fd = robus
2f350 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f  t_open(tPath, (O
2f360 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f  _RDWR|O_CREAT|O_
2f370 45 58 43 4c 29 2c 0a 20 20 20 20 20 20 20 20 20  EXCL),.         
2f380 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2f390 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
2f3a0 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66  RMISSIONS);.  if
2f3b0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71  ( fd<0 ){.    sq
2f3c0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2f3d0 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
2f3e0 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66  rrmsg, "create f
2f3f0 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
2f400 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
2f410 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
2f420 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65 28  .  if( osPwrite(
2f430 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e  fd, buf, readLen
2f440 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f 74  , 0) != (ssize_t
2f450 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20  )readLen ){.    
2f460 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2f470 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
2f480 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20   errmsg, "write 
2f490 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
2f4a0 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
2f4b0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
2f4c0 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74  }.  if( rename(t
2f4d0 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a  Path, cPath) ){.
2f4e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2f4f0 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
2f500 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72 65  sg), errmsg, "re
2f510 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29  name failed (%d)
2f520 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
2f530 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
2f540 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
2f550 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
2f560 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20  r, "broke stale 
2f570 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63  lock on %s\n", c
2f580 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f  Path);.  robust_
2f590 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e  close(pFile, con
2f5a0 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e  chFile->h, __LIN
2f5b0 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  E__);.  conchFil
2f5c0 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e  e->h = fd;.  con
2f5d0 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  chFile->openFlag
2f5e0 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
2f5f0 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b  REAT;..end_break
2f600 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29  lock:.  if( rc )
2f610 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20  {.    if( fd>=0 
2f620 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28  ){.      unlink(
2f630 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f  tPath);.      ro
2f640 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
2f650 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2f660 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
2f670 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c  tf(stderr, "fail
2f680 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c  ed to break stal
2f690 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73  e lock on %s, %s
2f6a0 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d  \n", cPath, errm
2f6b0 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
2f6c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
2f6d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
2f6e0 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
2f6f0 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20   file and break 
2f700 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20  a stale lock if 
2f710 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20  the .** host id 
2f720 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74  matches..*/.stat
2f730 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63  ic int proxyConc
2f740 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
2f750 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
2f760 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b  HostID, int lock
2f770 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  Type){.  proxyLo
2f780 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
2f790 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
2f7a0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
2f7b0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
2f7c0 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
2f7d0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
2f7e0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69  ->conchFile;.  i
2f7f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f800 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20  K;.  int nTries 
2f810 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69  = 0;.  struct ti
2f820 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54  mespec conchModT
2f830 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20 7b 0a 20  ime;.  .  do {. 
2f840 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
2f850 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
2f860 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
2f870 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b  )conchFile, lock
2f880 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69 65  Type);.    nTrie
2f890 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72 63  s ++;.    if( rc
2f8a0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
2f8b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2f8c0 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62 75   lock failed (bu
2f8d0 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31 73  sy):.       * 1s
2f8e0 74 20 74 72 79 3a 20 67 65 74 20 74 68 65 20 6d  t try: get the m
2f8f0 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20 63  od time of the c
2f900 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73 20  onch, wait 0.5s 
2f910 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 0a  and try again. .
2f920 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72 79         * 2nd try
2f930 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d 6f  : fail if the mo
2f940 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20 6f  d time changed o
2f950 72 20 68 6f 73 74 20 69 64 20 69 73 20 64 69 66  r host id is dif
2f960 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20 20  ferent, wait .  
2f970 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
2f980 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20   10 sec and try 
2f990 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20 33  again.       * 3
2f9a0 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74 68  rd try: break th
2f9b0 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68  e lock unless th
2f9c0 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20 63  e mod time has c
2f9d0 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20 2a  hanged..       *
2f9e0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  /.      struct s
2f9f0 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 69  tat buf;.      i
2fa00 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e 63 68  f( osFstat(conch
2fa10 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29  File->h, &buf) )
2fa20 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
2fa30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
2fa40 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
2fa50 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2fa60 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
2fa70 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e      .      if( n
2fa80 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20  Tries==1 ){.    
2fa90 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65      conchModTime
2faa0 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73   = buf.st_mtimes
2fab0 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c  pec;.        usl
2fac0 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20  eep(500000); /* 
2fad0 77 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64  wait 0.5 sec and
2fae0 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67   try the lock ag
2faf0 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  ain*/.        co
2fb00 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
2fb10 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
2fb20 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20   nTries>1 );.   
2fb30 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54     if( conchModT
2fb40 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75  ime.tv_sec != bu
2fb50 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74  f.st_mtimespec.t
2fb60 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20  v_sec || .      
2fb70 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e     conchModTime.
2fb80 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73  tv_nsec != buf.s
2fb90 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e  t_mtimespec.tv_n
2fba0 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  sec ){.        r
2fbb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2fbc0 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
2fbd0 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69   .      if( nTri
2fbe0 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20  es==2 ){  .     
2fbf0 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f     char tBuf[PRO
2fc00 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
2fc10 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  .        int len
2fc20 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68   = osPread(conch
2fc30 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50  File->h, tBuf, P
2fc40 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
2fc50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
2fc60 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  ( len<0 ){.     
2fc70 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
2fc80 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
2fc90 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2fca0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
2fcb0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
2fcc0 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f       if( len>PRO
2fcd0 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26 20  XY_PATHINDEX && 
2fce0 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50  tBuf[0]==(char)P
2fcf0 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
2fd00 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  N){.          /*
2fd10 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65   don't break the
2fd20 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f 73   lock if the hos
2fd30 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61 74  t id doesn't mat
2fd40 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
2fd50 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74  if( 0!=memcmp(&t
2fd60 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  Buf[PROXY_HEADER
2fd70 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
2fd80 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
2fd90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fda0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2fdb0 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  SY;.          }.
2fdc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2fdd0 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27           /* don'
2fde0 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b  t break the lock
2fdf0 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f   on short read o
2fe00 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d  r a version mism
2fe10 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
2fe20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fe30 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BUSY;.        }.
2fe40 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31          usleep(1
2fe50 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69  0000000); /* wai
2fe60 74 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79  t 10 sec and try
2fe70 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20   the lock again 
2fe80 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  */.        conti
2fe90 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  nue; .      }.  
2fea0 20 20 20 20 0a 20 20 20 20 20 20 61 73 73 65 72      .      asser
2feb0 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a  t( nTries==3 );.
2fec0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72 6f        if( 0==pro
2fed0 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b  xyBreakConchLock
2fee0 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44  (pFile, myHostID
2fef0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
2ff00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2ff10 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70       if( lockTyp
2ff20 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
2ff30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2ff40 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
2ff50 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
2ff60 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
2ff70 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c  chFile, SHARED_L
2ff80 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20 0a  OCK);          .
2ff90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ffa0 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
2ffb0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
2ffc0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
2ffd0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
2ffe0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
2fff0 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20  lockType);.     
30000 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
30010 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63   }.  } while( rc
30020 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
30030 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a   nTries<3 );.  .
30040 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30050 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e  /* Takes the con
30060 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73  ch by taking a s
30070 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72  hared lock and r
30080 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ead the contents
30090 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c   conch, if .** l
300a0 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e  ockPath is non-N
300b0 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44  ULL, the host ID
300c0 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   and lock file p
300d0 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20  ath must match. 
300e0 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b   A NULL .** lock
300f0 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20  Path means that 
30100 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20  the lockPath in 
30110 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
30120 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20 74  ill be used if t
30130 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20  he .** host IDs 
30140 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20  match, or a new 
30150 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
30160 65 20 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f  e generated auto
30170 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e  matically .** an
30180 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  d written to the
30190 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a   conch file..*/.
301a0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
301b0 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69  TakeConch(unixFi
301c0 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72  le *pFile){.  pr
301d0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
301e0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
301f0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
30200 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
30210 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66  ontext; .  .  if
30220 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
30230 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d!=0 ){.    retu
30240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30250 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46  }else{.    unixF
30260 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
30270 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
30280 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48  ;.    uuid_t myH
30290 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70  ostID;.    int p
302a0 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63  Error = 0;.    c
302b0 68 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58  har readBuf[PROX
302c0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
302d0 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74      char lockPat
302e0 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
302f0 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63     char *tempLoc
30300 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  kPath = NULL;.  
30310 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30320 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72  E_OK;.    int cr
30330 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20  eateConch = 0;. 
30340 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61 74     int hostIdMat
30350 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
30360 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20  readLen = 0;.   
30370 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50   int tryOldLockP
30380 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ath = 0;.    int
30390 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74   forceNewLockPat
303a0 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20  h = 0;.    .    
303b0 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f  OSTRACE(("TAKECO
303c0 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
303d0 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
303e0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
303f0 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b       (pCtx->lock
30400 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78  ProxyPath ? pCtx
30410 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
30420 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74  : ":auto:"), get
30430 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20 72 63  pid()));..    rc
30440 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49   = proxyGetHostI
30450 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45 72  D(myHostID, &pEr
30460 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 72  ror);.    if( (r
30470 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
30480 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 70  IOERR ){.      p
30490 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
304a0 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  = pError;.      
304b0 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
304c0 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ch;.    }.    rc
304d0 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63   = proxyConchLoc
304e0 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
304f0 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  D, SHARED_LOCK);
30500 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
30510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30520 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
30530 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ch;.    }.    /*
30540 20 72 65 61 64 20 74 68 65 20 65 78 69 73 74 69   read the existi
30550 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  ng conch file */
30560 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20 73  .    readLen = s
30570 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78  eekAndRead((unix
30580 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  File*)conchFile,
30590 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52 4f   0, readBuf, PRO
305a0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b  XY_MAXCONCHLEN);
305b0 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c 65 6e  .    if( readLen
305c0 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  <0 ){.      /* I
305d0 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45 72  /O error: lastEr
305e0 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
305f0 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20 20  ndRead */.      
30600 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
30610 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61   = conchFile->la
30620 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
30630 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
30640 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f 74  _READ;.      got
30650 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
30660 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
30670 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48  eadLen<=(PROXY_H
30680 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
30690 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20  OSTIDLEN) || .  
306a0 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 42             readB
306b0 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52 4f  uf[0]!=(char)PRO
306c0 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20  XY_CONCHVERSION 
306d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68  ){.      /* a sh
306e0 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65 72 73  ort read or vers
306f0 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61  ion format misma
30700 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65 65  tch means we nee
30710 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
30720 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63  w .      ** conc
30730 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a  h file. .      *
30740 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65 43 6f  /.      createCo
30750 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nch = 1;.    }. 
30760 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f 73     /* if the hos
30770 74 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e 64  t id matches and
30780 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 61   the lock path a
30790 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
307a0 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a   the conch.    *
307b0 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 75  * we'll try to u
307c0 73 65 20 74 68 65 20 70 61 74 68 20 74 68 65 72  se the path ther
307d0 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20 6f  e, if we can't o
307e0 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20 77  pen that path, w
307f0 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74  e'll .    ** ret
30800 72 79 20 77 69 74 68 20 61 20 6e 65 77 20 61 75  ry with a new au
30810 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61 74  to-generated pat
30820 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  h .    */.    do
30830 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65   { /* in case we
30840 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67 61   need to try aga
30850 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a  in for an :auto:
30860 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65   named lock file
30870 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21   */..      if( !
30880 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20 21  createConch && !
30890 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68  forceNewLockPath
308a0 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73 74   ){.        host
308b0 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d  IdMatch = !memcm
308c0 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  p(&readBuf[PROXY
308d0 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
308e0 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20 20  ostID, .        
308f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30900 20 20 20 20 20 20 20 20 20 20 50 52 4f 58 59 5f            PROXY_
30910 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20  HOSTIDLEN);.    
30920 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f      /* if the co
30930 6e 63 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d  nch has data com
30940 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pare the content
30950 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
30960 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   !pCtx->lockProx
30970 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  yPath ){.       
30980 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e     /* for auto-n
30990 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  amed local lock 
309a0 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63 6b  file, just check
309b0 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
309c0 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20 20   we'll.         
309d0 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f 63    ** use the loc
309e0 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  al lock file pat
309f0 68 20 74 68 61 74 27 73 20 61 6c 72 65 61 64 79  h that's already
30a00 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20 20 20   in there.      
30a10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30a20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63    if( hostIdMatc
30a30 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h ){.           
30a40 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20   size_t pathLen 
30a50 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f  = (readLen - PRO
30a60 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a 20  XY_PATHINDEX);. 
30a70 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
30a80 20 20 20 20 20 20 20 20 69 66 28 20 70 61 74 68          if( path
30a90 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20  Len>=MAXPATHLEN 
30aa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30ab0 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48   pathLen=MAXPATH
30ac0 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  LEN-1;.         
30ad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
30ae0 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68   memcpy(lockPath
30af0 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  , &readBuf[PROXY
30b00 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61 74  _PATHINDEX], pat
30b10 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  hLen);.         
30b20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68     lockPath[path
30b30 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Len] = 0;.      
30b40 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61        tempLockPa
30b50 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20  th = lockPath;. 
30b60 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c             tryOl
30b70 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20  dLockPath = 1;. 
30b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 72             /* cr
30b90 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
30ba0 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69 66 20  he lock path if 
30bb0 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b  the conch is tak
30bc0 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  en */.          
30bd0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
30be0 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 20 20  onch;.          
30bf0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
30c00 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 0a  if( hostIdMatch.
30c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
30c20 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d  & !strncmp(pCtx-
30c30 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20  >lockProxyPath, 
30c40 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50  &readBuf[PROXY_P
30c50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20  ATHINDEX],.     
30c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c70 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d 50 52        readLen-PR
30c80 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 0a 20  OXY_PATHINDEX). 
30c90 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
30ca0 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73      /* conch hos
30cb0 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20  t and lock path 
30cc0 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
30cd0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
30ce0 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20 20 20  conch; .        
30cf0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
30d00 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65  .      /* if the
30d10 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77 72 69   conch isn't wri
30d20 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27  table and doesn'
30d30 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61 6e 27  t match, we can'
30d40 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20  t take it */.   
30d50 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46 69 6c     if( (conchFil
30d60 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52  e->openFlags&O_R
30d70 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20  DWR) == 0 ){.   
30d80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30d90 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67  _BUSY;.        g
30da0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
30db0 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  h;.      }.     
30dc0 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74 68 65   .      /* eithe
30dd0 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69 64 6e  r the conch didn
30de0 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65 20 6e  't match or we n
30df0 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
30e00 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20  new one */.     
30e10 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b   if( !pCtx->lock
30e20 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
30e30 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63       proxyGetLoc
30e40 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61  kPath(pCtx->dbPa
30e50 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41  th, lockPath, MA
30e60 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
30e70 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20     tempLockPath 
30e80 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20  = lockPath;.    
30e90 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20      /* create a 
30ea0 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b  copy of the lock
30eb0 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20   path _only_ if 
30ec0 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b  the conch is tak
30ed0 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  en */.      }.  
30ee0 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 75 70      .      /* up
30ef0 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20  date conch with 
30f00 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20 28 74  host and path (t
30f10 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66  his will fail if
30f20 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
30f30 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20 73 68       ** has a sh
30f40 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64  ared lock alread
30f50 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73 74 20  y), if the host 
30f60 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73 65 20  id matches, use 
30f70 74 68 65 20 62 69 67 0a 20 20 20 20 20 20 2a 2a  the big.      **
30f80 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f   stick..      */
30f90 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73 28 63  .      futimes(c
30fa0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c  onchFile->h, NUL
30fb0 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f  L);.      if( ho
30fc0 73 74 49 64 4d 61 74 63 68 20 26 26 20 21 63 72  stIdMatch && !cr
30fd0 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20  eateConch ){.   
30fe0 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69       if( conchFi
30ff0 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 63 6f  le->pInode && co
31000 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  nchFile->pInode-
31010 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
31020 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
31030 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
31040 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
31050 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
31060 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20  d in this.      
31070 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
31080 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
31090 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
310a0 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ock. */.        
310b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
310c0 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  SY;.        } el
310d0 73 65 20 7b 20 20 20 20 20 20 20 20 20 20 0a 20  se {          . 
310e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72           rc = pr
310f0 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  oxyConchLock(pFi
31100 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45 58  le, myHostID, EX
31110 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
31120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31130 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
31140 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
31150 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
31160 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
31170 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45  hFile, EXCLUSIVE
31180 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
31190 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
311a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
311b0 20 20 20 63 68 61 72 20 77 72 69 74 65 42 75 66     char writeBuf
311c0 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  fer[PROXY_MAXCON
311d0 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20  CHLEN];.        
311e0 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20 3d 20  int writeSize = 
311f0 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  0;.        .    
31200 20 20 20 20 77 72 69 74 65 42 75 66 66 65 72 5b      writeBuffer[
31210 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f 58 59  0] = (char)PROXY
31220 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20  _CONCHVERSION;. 
31230 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 77         memcpy(&w
31240 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
31250 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
31260 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53  ostID, PROXY_HOS
31270 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  TIDLEN);.       
31280 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50   if( pCtx->lockP
31290 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29  roxyPath!=NULL )
312a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c  {.          strl
312b0 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72  cpy(&writeBuffer
312c0 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
312d0 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ], pCtx->lockPro
312e0 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  xyPath, MAXPATHL
312f0 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  EN);.        }el
31300 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
31310 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
31320 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
31330 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74  EX], tempLockPat
31340 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
31350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31360 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20 50 52    writeSize = PR
31370 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 2b 20  OXY_PATHINDEX + 
31380 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42 75 66  strlen(&writeBuf
31390 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  fer[PROXY_PATHIN
313a0 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  DEX]);.        r
313b0 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
313c0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72  conchFile->h, wr
313d0 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  iteSize);.      
313e0 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65    rc = unixWrite
313f0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
31400 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69 74  )conchFile, writ
31410 65 42 75 66 66 65 72 2c 20 77 72 69 74 65 53 69  eBuffer, writeSi
31420 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ze, 0);.        
31430 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d  fsync(conchFile-
31440 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  >h);.        /* 
31450 49 66 20 77 65 20 63 72 65 61 74 65 64 20 61 20  If we created a 
31460 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65 20 28  new conch file (
31470 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74 65 64  not just updated
31480 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
31490 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20   a .         ** 
314a0 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69 6c 65  valid conch file
314b0 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  ), try to match 
314c0 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
314d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
314e0 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
314f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31500 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61 74 65  ITE_OK && create
31510 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Conch ){.       
31520 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
31530 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  uf;.          in
31540 74 20 65 72 72 20 3d 20 6f 73 46 73 74 61 74 28  t err = osFstat(
31550 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b  pFile->h, &buf);
31560 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
31570 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
31580 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64       mode_t cmod
31590 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26  e = buf.st_mode&
315a0 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55 53 52  (S_IRUSR|S_IWUSR
315b0 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49 57 47   | S_IRGRP|S_IWG
315c0 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  RP |.           
315d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 5f 49               S_I
315f0 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20  ROTH|S_IWOTH);. 
31600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
31610 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 64  y to match the d
31620 61 74 61 62 61 73 65 20 66 69 6c 65 20 52 2f 57  atabase file R/W
31630 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67   permissions, ig
31640 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a  nore failure */.
31650 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50  #ifndef SQLITE_P
31660 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20  ROXY_DEBUG.     
31670 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28         osFchmod(
31680 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d  conchFile->h, cm
31690 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ode);.#else.    
316a0 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
316b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6f            rc = o
316c0 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c  sFchmod(conchFil
316d0 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 20 20  e->h, cmode);.  
316e0 20 20 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65            }while
316f0 28 20 72 63 3d 3d 28 2d 31 29 20 26 26 20 65 72  ( rc==(-1) && er
31700 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
31710 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31720 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
31730 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20       int code = 
31740 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
31750 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
31760 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20  err, "fchmod %o 
31770 46 41 49 4c 45 44 20 77 69 74 68 20 25 64 20 25  FAILED with %d %
31780 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
31790 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 6f 64              cmod
317a0 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f  e, code, strerro
317b0 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20 20 20  r(code));.      
317c0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
317d0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72               fpr
317e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
317f0 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45 44  hmod %o SUCCEDED
31800 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20 20 20  \n",cmode);.    
31810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31830 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
31840 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
31850 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
31860 65 72 72 2c 20 22 53 54 41 54 20 46 41 49 4c 45  err, "STAT FAILE
31870 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20 25 73  D[%d] with %d %s
31880 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
31890 20 20 20 20 20 20 20 20 20 20 65 72 72 2c 20 63            err, c
318a0 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f  ode, strerror(co
318b0 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  de));.#endif.   
318c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
318d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
318e0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
318f0 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
31900 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
31910 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f  hFile, SHARED_LO
31920 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  CK);.      .    
31930 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20  end_takeconch:. 
31940 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
31950 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45  RANSPROXY: CLOSE
31960 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e    %d\n", pFile->
31970 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  h));.      if( r
31980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31990 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
319a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
319b0 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
319c0 20 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f           robust_
319d0 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69  close(pFile, pFi
319e0 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  le->h, __LINE__)
319f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31a00 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
31a10 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  1;.        int f
31a20 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
31a30 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46  pCtx->dbPath, pF
31a40 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a  ile->openFlags,.
31a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a60 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
31a70 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
31a80 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 20 20  SIONS);.        
31a90 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50  OSTRACE(("TRANSP
31aa0 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e  ROXY: OPEN  %d\n
31ab0 22 2c 20 66 64 29 29 3b 0a 20 20 20 20 20 20 20  ", fd));.       
31ac0 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
31ad0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
31ae0 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20 7d   = fd;.        }
31af0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31b00 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rc=SQLITE_CANTOP
31b10 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49  EN_BKPT; /* SQLI
31b20 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61  TE_BUSY? proxyTa
31b30 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20  keConch called. 
31b40 20 20 20 20 20 20 20 20 20 20 64 75 72 69 6e 67            during
31b50 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
31b60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31b70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31b80 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e  TE_OK && !pCtx->
31b90 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20  lockProxy ){.   
31ba0 20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 20       char *path 
31bb0 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f  = tempLockPath ?
31bc0 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20   tempLockPath : 
31bd0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
31be0 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ath;.        rc 
31bf0 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  = proxyCreateUni
31c00 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74  xFile(path, &pCt
31c10 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29  x->lockProxy, 1)
31c20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
31c30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
31c40 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
31c50 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74  && tryOldLockPat
31c60 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  h ){.          /
31c70 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20 63 72  * we couldn't cr
31c80 65 61 74 65 20 74 68 65 20 70 72 6f 78 79 20 6c  eate the proxy l
31c90 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20 74 68  ock file with th
31ca0 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20  e old lock file 
31cb0 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 20  path.           
31cc0 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69 6e 20  ** so try again 
31cd0 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20  via auto-naming 
31ce0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  .           */. 
31cf0 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65           forceNe
31d00 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20  wLockPath = 1;. 
31d10 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c           tryOldL
31d20 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
31d30 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
31d40 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20 74   /* go back to t
31d50 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73  he do {} while s
31d60 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20  tart point, try 
31d70 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20  again */.       
31d80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
31d90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31da0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
31db0 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20   Need to make a 
31dc0 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69 66 20  copy of path if 
31dd0 77 65 20 65 78 74 72 61 63 74 65 64 20 74 68 65  we extracted the
31de0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20   value.         
31df0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63  ** from the conc
31e00 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 61  h file or the pa
31e10 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  th was allocated
31e20 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a 20 20   on the stack.  
31e30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31e40 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61    if( tempLockPa
31e50 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
31e60 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
31e70 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
31e80 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63  trDup(0, tempLoc
31e90 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  kPath);.        
31ea0 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
31eb0 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
31ec0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
31ed0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
31ee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31ef0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
31f00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31f10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
31f20 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
31f30 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
31f40 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f      if( pCtx->lo
31f50 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
31f60 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
31f70 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  s ){.          a
31f80 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
31f90 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20 20 20   *afpCtx;.      
31fa0 20 20 20 20 61 66 70 43 74 78 20 3d 20 28 61 66      afpCtx = (af
31fb0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
31fc0 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  *)pCtx->lockProx
31fd0 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  y->lockingContex
31fe0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70  t;.          afp
31ff0 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 70 43  Ctx->dbPath = pC
32000 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
32010 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
32020 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
32030 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70      conchFile->p
32040 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
32050 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
32060 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43  onchFile, NO_LOC
32070 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
32080 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45    OSTRACE(("TAKE
32090 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c  CONCH  %d %s\n",
320a0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
320b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
320c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22  ==SQLITE_OK?"ok"
320d0 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  :"failed"));.   
320e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
320f0 20 20 7d 20 77 68 69 6c 65 20 28 31 29 3b 20 2f    } while (1); /
32100 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65  * in case we nee
32110 64 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 3a  d to retry the :
32120 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20  auto: lock file 
32130 2d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  - .             
32140 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
32150 20 6e 65 76 65 72 20 67 65 74 20 68 65 72 65 20   never get here 
32160 65 78 63 65 70 74 20 76 69 61 20 74 68 65 20 27  except via the '
32170 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20  continue' call. 
32180 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  */.  }.}../*.** 
32190 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61  If pFile holds a
321a0 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68   lock on a conch
321b0 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65   file, then rele
321c0 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a  ase that lock..*
321d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
321e0 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75  xyReleaseConch(u
321f0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
32200 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
32210 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  TE_OK;         /
32220 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74  * Subroutine ret
32230 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72  urn code */.  pr
32240 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
32250 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65  t *pCtx;  /* The
32260 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
32270 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c   for the proxy l
32280 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ock */.  unixFil
32290 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20  e *conchFile;   
322a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
322b0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
322c0 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f  /..  pCtx = (pro
322d0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
322e0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
322f0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63  gContext;.  conc
32300 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
32310 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41  nchFile;.  OSTRA
32320 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43  CE(("RELEASECONC
32330 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64  H  %d for %s pid
32340 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c  =%d\n", conchFil
32350 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
32360 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   (pCtx->lockProx
32370 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f  yPath ? pCtx->lo
32380 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a  ckProxyPath : ":
32390 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20  auto:"), .      
323a0 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b       getpid()));
323b0 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e  .  if( pCtx->con
323c0 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
323d0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
323e0 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
323f0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
32400 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f  conchFile, NO_LO
32410 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d  CK);.  }.  pCtx-
32420 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a  >conchHeld = 0;.
32430 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45    OSTRACE(("RELE
32440 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c  ASECONCH  %d %s\
32450 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
32460 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63  ,.           (rc
32470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
32480 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29  k" : "failed")))
32490 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
324a0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
324b0 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
324c0 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75  base file, compu
324d0 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69  te the name of i
324e0 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  ts conch file..*
324f0 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63  * Store the conc
32500 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65  h filename in me
32510 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
32520 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
32530 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43  c()..** Make *pC
32540 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74  onchPath point t
32550 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20  o the new name. 
32560 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
32570 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
32580 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
32590 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74  if unable to obt
325a0 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  ain memory..**.*
325b0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * The caller is 
325c0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
325d0 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
325e0 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  e allocated memo
325f0 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65  ry.** space is e
32600 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e  ventually freed.
32610 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61  .**.** *pConchPa
32620 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  th is set to NUL
32630 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  L if a memory al
32640 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
32650 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
32660 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
32670 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68  ConchPathname(ch
32680 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72  ar *dbPath, char
32690 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a   **pConchPath){.
326a0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
326b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326c0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
326d0 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28  */.  int len = (
326e0 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
326f0 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66  h); /* Length of
32700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
32710 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20  me - dbPath */. 
32720 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68   char *conchPath
32730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
32740 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68 69 63  * buffer in whic
32750 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63  h to construct c
32760 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  onch name */..  
32770 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
32780 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  e for the conch 
32790 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69  filename and ini
327a0 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65  tialize the name
327b0 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d   to.  ** the nam
327c0 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
327d0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
327e0 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50   */  .  *pConchP
327f0 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20  ath = conchPath 
32800 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
32810 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38  3_malloc(len + 8
32820 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61  );.  if( conchPa
32830 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  th==0 ){.    ret
32840 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
32850 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63  ;.  }.  memcpy(c
32860 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61 74 68  onchPath, dbPath
32870 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f  , len+1);.  .  /
32880 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22  * now insert a "
32890 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61  ." before the la
328a0 73 74 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a  st / character *
328b0 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d  /.  for( i=(len-
328c0 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b  1); i>=0; i-- ){
328d0 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61  .    if( conchPa
328e0 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  th[i]=='/' ){.  
328f0 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62      i++;.      b
32900 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
32910 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27    conchPath[i]='
32920 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c  .';.  while ( i<
32930 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68  len ){.    conch
32940 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68  Path[i+1]=dbPath
32950 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  [i];.    i++;.  
32960 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74  }..  /* append t
32970 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66  he "-conch" suff
32980 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a  ix to the file *
32990 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63  /.  memcpy(&conc
329a0 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f  hPath[i+1], "-co
329b0 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65  nch", 7);.  asse
329c0 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  rt( (int)strlen(
329d0 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65  conchPath) == le
329e0 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  n+7 );..  return
329f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
32a00 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79  /* Takes a fully
32a10 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78   configured prox
32a20 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20  y locking-style 
32a30 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77  unix file and sw
32a40 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f  itches.** the lo
32a50 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  cal lock file pa
32a60 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th .*/.static in
32a70 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78  t switchLockProx
32a80 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a  yPath(unixFile *
32a90 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  pFile, const cha
32aa0 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f  r *path) {.  pro
32ab0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
32ac0 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
32ad0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
32ae0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
32af0 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c  text;.  char *ol
32b00 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f  dPath = pCtx->lo
32b10 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69  ckProxyPath;.  i
32b20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
32b30 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  K;..  if( pFile-
32b40 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
32b50 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
32b60 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
32b70 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69   }  ..  /* nothi
32b80 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20  ng to do if the 
32b90 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61  path is NULL, :a
32ba0 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20  uto: or matches 
32bb0 74 68 65 20 65 78 69 73 74 69 6e 67 20 70 61 74  the existing pat
32bc0 68 20 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68  h */.  if( !path
32bd0 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30   || path[0]=='\0
32be0 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74  ' || !strcmp(pat
32bf0 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a  h, ":auto:") ||.
32c00 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20      (oldPath && 
32c10 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68  !strncmp(oldPath
32c20 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  , path, MAXPATHL
32c30 45 4e 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  EN)) ){.    retu
32c40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
32c50 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46  }else{.    unixF
32c60 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d  ile *lockProxy =
32c70 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
32c80 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b  ;.    pCtx->lock
32c90 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20  Proxy=NULL;.    
32ca0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
32cb0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  = 0;.    if( loc
32cc0 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a  kProxy!=NULL ){.
32cd0 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f        rc=lockPro
32ce0 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  xy->pMethod->xCl
32cf0 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
32d00 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  e *)lockProxy);.
32d10 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
32d20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
32d30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63  sqlite3_free(loc
32d40 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20  kProxy);.    }. 
32d50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
32d60 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43  oldPath);.    pC
32d70 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
32d80 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
32d90 44 75 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20  Dup(0, path);.  
32da0 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  }.  .  return rc
32db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65  ;.}../*.** pFile
32dc0 20 69 73 20 61 20 66 69 6c 65 20 74 68 61 74 20   is a file that 
32dd0 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  has been opened 
32de0 62 79 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e  by a prior xOpen
32df0 20 63 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a   call.  dbPath.*
32e00 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 62 75  * is a string bu
32e10 66 66 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41  ffer at least MA
32e20 58 50 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61  XPATHLEN+1 chara
32e30 63 74 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  cters in size..*
32e40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
32e50 65 20 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e  e find the filen
32e60 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ame associated w
32e70 69 74 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72  ith pFile and wr
32e80 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64  ites it.** int d
32e90 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  bPath..*/.static
32ea0 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50   int proxyGetDbP
32eb0 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75  athForUnixFile(u
32ec0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
32ed0 63 68 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23  char *dbPath){.#
32ee0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
32ef0 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c  LE__).  if( pFil
32f00 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61  e->pMethod == &a
32f10 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  fpIoMethods ){. 
32f20 20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20     /* afp style 
32f30 6b 65 65 70 73 20 61 20 72 65 66 65 72 65 6e 63  keeps a referenc
32f40 65 20 74 6f 20 74 68 65 20 64 62 20 70 61 74 68  e to the db path
32f50 20 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68   in the filePath
32f60 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f   field .    ** o
32f70 66 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a  f the struct */.
32f80 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74      assert( (int
32f90 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70  )strlen((char*)p
32fa0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
32fb0 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45  text)<=MAXPATHLE
32fc0 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79  N );.    strlcpy
32fd0 28 64 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f  (dbPath, ((afpLo
32fe0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
32ff0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
33000 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c 20 4d  text)->dbPath, M
33010 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 20  AXPATHLEN);.  } 
33020 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66  else.#endif.  if
33030 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
33040 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65   == &dotlockIoMe
33050 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
33060 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75  dot lock style u
33070 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
33080 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65  context to store
33090 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20   the dot lock.  
330a0 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a    ** file path *
330b0 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20  /.    int len = 
330c0 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70  strlen((char *)p
330d0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
330e0 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44  text) - strlen(D
330f0 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a  OTLOCK_SUFFIX);.
33100 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74      memcpy(dbPat
33110 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65  h, (char *)pFile
33120 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
33130 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65  , len + 1);.  }e
33140 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20  lse{.    /* all 
33150 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75 73 65  other styles use
33160 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
33170 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68  text to store th
33180 65 20 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a  e db file path *
33190 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74  /.    assert( st
331a0 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c  rlen((char*)pFil
331b0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
331c0 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29  t)<=MAXPATHLEN )
331d0 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 62  ;.    strlcpy(db
331e0 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46  Path, (char *)pF
331f0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
33200 65 78 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ext, MAXPATHLEN)
33210 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
33220 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
33230 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65  ** Takes an alre
33240 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e  ady filled in un
33250 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65  ix file and alte
33260 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c  rs it so all fil
33270 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69  e locking .** wi
33280 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  ll be performed 
33290 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f  on the local pro
332a0 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54  xy lock file.  T
332b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
332c0 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65  lds.** are prese
332d0 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b  rved in the lock
332e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74  ing context so t
332f0 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20  hat they can be 
33300 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a  restored and .**
33310 20 74 68 65 20 75 6e 69 78 20 73 74 72 75 63 74   the unix struct
33320 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65  ure properly cle
33330 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65  aned up at close
33340 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63   time:.**  ->loc
33350 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20  kingContext.**  
33360 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61  ->pMethod.*/.sta
33370 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61  tic int proxyTra
33380 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75  nsformUnixFile(u
33390 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
333a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
333b0 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ) {.  proxyLocki
333c0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
333d0 0a 20 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d  .  char dbPath[M
333e0 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20  AXPATHLEN+1];   
333f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
33400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33410 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b   */.  char *lock
33420 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74  Path=NULL;.  int
33430 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33440 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .  .  if( pFile-
33450 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
33460 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
33470 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
33480 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50   }.  proxyGetDbP
33490 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70  athForUnixFile(p
334a0 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20  File, dbPath);. 
334b0 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61   if( !path || pa
334c0 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21  th[0]=='\0' || !
334d0 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61  strcmp(path, ":a
334e0 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f  uto:") ){.    lo
334f0 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d  ckPath=NULL;.  }
33500 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61  else{.    lockPa
33510 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b  th=(char *)path;
33520 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43  .  }.  .  OSTRAC
33530 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20  E(("TRANSPROXY  
33540 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
33550 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
33560 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50            (lockP
33570 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a  ath ? lockPath :
33580 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70   ":auto:"), getp
33590 69 64 28 29 29 29 3b 0a 0a 20 20 70 43 74 78 20  id()));..  pCtx 
335a0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
335b0 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20  ( sizeof(*pCtx) 
335c0 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30  );.  if( pCtx==0
335d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
335e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
335f0 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20  .  memset(pCtx, 
33600 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  0, sizeof(*pCtx)
33610 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78 79  );..  rc = proxy
33620 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e  CreateConchPathn
33630 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70 43 74  ame(dbPath, &pCt
33640 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
33650 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
33660 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
33670 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e   = proxyCreateUn
33680 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e  ixFile(pCtx->con
33690 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70 43 74  chFilePath, &pCt
336a0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20 30 29  x->conchFile, 0)
336b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
336c0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 26 26  LITE_CANTOPEN &&
336d0 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c   ((pFile->openFl
336e0 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30  ags&O_RDWR) == 0
336f0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  ) ){.      /* if
33700 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20 66 6c   (a) the open fl
33710 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f 52 44  ags are not O_RD
33720 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f 6e 63  WR, (b) the conc
33730 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c 20 61  h isn't there, a
33740 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63 29 20  nd.      ** (c) 
33750 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20  the file system 
33760 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68  is read-only, th
33770 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c 6f 63  en enable no-loc
33780 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20 20 20  king access..   
33790 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e 63 65     ** Ugh, since
337a0 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30 30 30   O_RDONLY==0x000
337b0 30 20 77 65 20 74 65 73 74 20 66 6f 72 20 21 4f  0 we test for !O
337c0 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e 69 78  _RDWR since unix
337d0 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20 20 20  Open asserts.   
337e0 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65 6e 46     ** that openF
337f0 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65 20 6f  lags will have o
33800 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52 44 4f  nly one of O_RDO
33810 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e 0a 20  NLY or O_RDWR.. 
33820 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
33830 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
33840 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
33850 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66 6f 3b   stat conchInfo;
33860 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c 6f 63  .      int goLoc
33870 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20 20 20  kless = 0;..    
33880 20 20 69 66 28 20 6f 73 53 74 61 74 28 70 43 74    if( osStat(pCt
33890 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
338a0 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d  , &conchInfo) ==
338b0 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 20 20   -1 ) {.        
338c0 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
338d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 72  .        if( (er
338e0 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28 73  r==ENOENT) && (s
338f0 74 61 74 66 73 28 64 62 50 61 74 68 2c 20 26 66  tatfs(dbPath, &f
33900 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29 7b  sInfo) != -1) ){
33910 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c 6f 63  .          goLoc
33920 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66 6f 2e  kless = (fsInfo.
33930 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f 4e  f_flags&MNT_RDON
33940 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e 4c  LY) == MNT_RDONL
33950 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
33960 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67     }.      if( g
33970 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20 20  oLockless ){.   
33980 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
33990 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72 65  Held = -1; /* re
339a0 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63 6b  ad only FS/ lock
339b0 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  less */.        
339c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
339d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
339e0 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  }  .  if( rc==SQ
339f0 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50  LITE_OK && lockP
33a00 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d  ath ){.    pCtx-
33a10 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
33a20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
33a30 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  (0, lockPath);. 
33a40 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
33a50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
33a60 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71  Ctx->dbPath = sq
33a70 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
33a80 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66   dbPath);.    if
33a90 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d  ( pCtx->dbPath==
33aa0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63  NULL ){.      rc
33ab0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
33ac0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
33ad0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33ae0 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d  {.    /* all mem
33af0 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ory is allocated
33b00 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63 72 65  , proxys are cre
33b10 61 74 65 64 20 61 6e 64 20 61 73 73 69 67 6e 65  ated and assigne
33b20 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69 74 63  d, .    ** switc
33b30 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  h the locking co
33b40 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f  ntext and pMetho
33b50 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20  d then return.. 
33b60 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e     */.    pCtx->
33b70 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
33b80 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t = pFile->locki
33b90 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70  ngContext;.    p
33ba0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
33bb0 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20 20  text = pCtx;.   
33bc0 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f   pCtx->pOldMetho
33bd0 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  d = pFile->pMeth
33be0 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  od;.    pFile->p
33bf0 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79 49  Method = &proxyI
33c00 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
33c10 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  e{.    if( pCtx-
33c20 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20  >conchFile ){ . 
33c30 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
33c40 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
33c50 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
33c60 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63  ile *)pCtx->conc
33c70 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  hFile);.      sq
33c80 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
33c90 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  >conchFile);.   
33ca0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
33cb0 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f  Free(0, pCtx->lo
33cc0 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  ckProxyPath);.  
33cd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
33ce0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
33cf0 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65  th); .    sqlite
33d00 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20  3_free(pCtx);.  
33d10 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  }.  OSTRACE(("TR
33d20 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c  ANSPROXY  %d %s\
33d30 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
33d40 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51           (rc==SQ
33d50 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
33d60 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20   "failed")));.  
33d70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
33d80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
33d90 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69 74 65  e handles sqlite
33da0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29  3_file_control()
33db0 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72 65 20   calls that are 
33dc0 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70  specific.** to p
33dd0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  roxy locking..*/
33de0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
33df0 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  yFileControl(sql
33e00 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
33e10 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
33e20 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  g){.  switch( op
33e30 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
33e40 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
33e50 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75  YFILE: {.      u
33e60 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
33e70 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
33e80 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
33e90 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f  >pMethod == &pro
33ea0 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  xyIoMethods ){. 
33eb0 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b         proxyLock
33ec0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
33ed0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
33ee0 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e  Context*)pFile->
33ef0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
33f00 20 20 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b          proxyTak
33f10 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
33f20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
33f30 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
33f40 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f  {.          *(co
33f50 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67  nst char **)pArg
33f60 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
33f70 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  xyPath;.        
33f80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
33f90 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a   *(const char **
33fa0 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20  )pArg = ":auto: 
33fb0 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20  (not held)";.   
33fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65       }.      } e
33fd0 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28  lse {.        *(
33fe0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
33ff0 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  rg = NULL;.     
34000 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
34010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
34020 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
34030 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
34040 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  LE: {.      unix
34050 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
34060 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
34070 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
34080 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74  TE_OK;.      int
34090 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20   isProxyStyle = 
340a0 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20  (pFile->pMethod 
340b0 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f  == &proxyIoMetho
340c0 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ds);.      if( p
340d0 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f  Arg==NULL || (co
340e0 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d  nst char *)pArg=
340f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
34100 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29  ( isProxyStyle )
34110 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  {.          /* t
34120 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f  urn off proxy lo
34130 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70  cking - not supp
34140 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  orted */.       
34150 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
34160 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52  RROR /*SQLITE_PR
34170 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d  OTOCOL? SQLITE_M
34180 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20  ISUSE?*/;.      
34190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
341a0 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70     /* turn off p
341b0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61  roxy locking - a
341c0 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f  lready off - NOO
341d0 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  P */.          r
341e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
341f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34200 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
34210 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50  nst char *proxyP
34220 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ath = (const cha
34230 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  r *)pArg;.      
34240 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79    if( isProxySty
34250 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
34260 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
34270 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20  ext *pCtx = .   
34280 20 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c           (proxyL
34290 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
342a0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
342b0 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  text;.          
342c0 69 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67  if( !strcmp(pArg
342d0 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20  , ":auto:") .   
342e0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78          || (pCtx
342f0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
34300 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
34310 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d    !strncmp(pCtx-
34320 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20  >lockProxyPath, 
34330 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41  proxyPath, MAXPA
34340 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20  THLEN)).        
34350 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
34360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
34370 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
34380 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
34390 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f   = switchLockPro
343a0 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72  xyPath(pFile, pr
343b0 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20  oxyPath);.      
343c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
343d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
343e0 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20  * turn on proxy 
343f0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  file locking */.
34400 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
34410 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
34420 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f  xFile(pFile, pro
34430 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
34440 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
34450 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34460 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
34470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
34480 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c   );  /* The call
34490 20 61 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e   assures that on
344a0 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73  ly valid opcodes
344b0 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20   are sent */.   
344c0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
344d0 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e  ACHED*/.  return
344e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
344f0 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74  ../*.** Within t
34500 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68  his division (th
34510 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69  e proxying locki
34520 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
34530 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  n) the procedure
34540 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20  s.** above this 
34550 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74  point are all ut
34560 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f  ilities.  The lo
34570 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f  ck-related metho
34580 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f  ds of the.** pro
34590 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74  xy-locking sqlit
345a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a  e3_io_method obj
345b0 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a  ect follow..*/..
345c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
345d0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
345e0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
345f0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
34600 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
34610 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
34620 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
34630 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
34640 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
34650 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
34660 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
34670 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
34680 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
34690 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
346a0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
346b0 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
346c0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
346d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
346e0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
346f0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
34700 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
34710 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
34720 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
34730 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
34740 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
34750 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
34760 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
34770 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
34780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
34790 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
347a0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
347b0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
347c0 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
347d0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
347e0 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
347f0 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  Held>0 ){.      
34800 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20  unixFile *proxy 
34810 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
34820 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  y;.      return 
34830 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  proxy->pMethod->
34840 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
34850 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
34860 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f 75 74  *)proxy, pResOut
34870 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 2f 2a  );.    }else{ /*
34880 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69   conchHeld < 0 i
34890 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  s lockless */.  
348a0 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b 0a 20      pResOut=0;. 
348b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
348c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
348d0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
348e0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
348f0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
34900 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
34910 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
34920 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
34930 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
34940 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
34950 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
34960 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
34970 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
34980 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
34990 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
349a0 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
349b0 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
349c0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
349d0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
349e0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
349f0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
34a00 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
34a10 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
34a20 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
34a30 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
34a40 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
34a50 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
34a60 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
34a70 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
34a80 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
34a90 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
34aa0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
34ab0 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
34ac0 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
34ad0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
34ae0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
34af0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
34b00 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
34b10 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
34b20 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
34b30 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
34b40 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
34b50 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
34b60 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
34b70 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
34b80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
34b90 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
34ba0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
34bb0 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
34bc0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
34bd0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
34be0 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
34bf0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
34c00 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
34c10 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
34c20 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
34c30 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
34c40 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
34c50 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
34c60 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
34c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34c80 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
34c90 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
34ca0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
34cb0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
34cc0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
34cd0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
34ce0 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
34cf0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
34d00 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
34d10 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  oxy;.      rc = 
34d20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  proxy->pMethod->
34d30 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
34d40 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c  ile*)proxy, eFil
34d50 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70 46  eLock);.      pF
34d60 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
34d70 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63   proxy->eFileLoc
34d80 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
34d90 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64      /* conchHeld
34da0 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73   < 0 is lockless
34db0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
34dc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
34dd0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
34de0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
34df0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
34e00 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
34e10 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
34e20 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
34e30 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
34e40 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
34e50 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
34e60 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
34e70 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
34e80 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
34e90 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
34ea0 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
34eb0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
34ec0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
34ed0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e  atic int proxyUn
34ee0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
34ef0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
34f00 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
34f10 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
34f20 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
34f30 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43   rc = proxyTakeC
34f40 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69  onch(pFile);.  i
34f50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34f60 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63   ){.    proxyLoc
34f70 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
34f80 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
34f90 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
34fa0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
34fb0 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
34fc0 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20  conchHeld>0 ){. 
34fd0 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
34fe0 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
34ff0 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63  kProxy;.      rc
35000 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f   = proxy->pMetho
35010 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
35020 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
35030 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20   eFileLock);.   
35040 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
35050 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69  ock = proxy->eFi
35060 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  leLock;.    }els
35070 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63  e{.      /* conc
35080 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
35090 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  kless */.    }. 
350a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
350b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
350c0 20 66 69 6c 65 20 74 68 61 74 20 75 73 65 73 20   file that uses 
350d0 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a  proxy locks..*/.
350e0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
350f0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
35100 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
35110 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
35120 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
35130 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70  xFile*)id;.    p
35140 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
35150 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
35160 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
35170 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
35180 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69  Context;.    uni
35190 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
351a0 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
351b0 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xy;.    unixFile
351c0 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
351d0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
351e0 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
351f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20  TE_OK;.    .    
35200 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b  if( lockProxy ){
35210 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
35220 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
35230 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
35240 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79  _file*)lockProxy
35250 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
35260 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
35270 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
35280 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74   lockProxy->pMet
35290 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
352a0 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50  ite3_file*)lockP
352b0 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28  roxy);.      if(
352c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
352d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
352e0 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  ree(lockProxy);.
352f0 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
35300 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d  Proxy = 0;.    }
35310 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69  .    if( conchFi
35320 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
35330 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
35340 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
35350 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63  proxyReleaseConc
35360 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
35370 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
35380 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
35390 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
353a0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  le->pMethod->xCl
353b0 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
353c0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  e*)conchFile);. 
353d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
353e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
353f0 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 63  qlite3_free(conc
35400 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hFile);.    }.  
35410 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
35420 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  0, pCtx->lockPro
35430 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  xyPath);.    sql
35440 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
35450 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a  conchFilePath);.
35460 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
35470 65 28 30 2c 20 70 43 74 78 2d 3e 64 62 50 61 74  e(0, pCtx->dbPat
35480 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f  h);.    /* resto
35490 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  re the original 
354a0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
354b0 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e  and pMethod then
354c0 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20   close it */.   
354d0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
354e0 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f  ontext = pCtx->o
354f0 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
35500 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ;.    pFile->pMe
35510 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c  thod = pCtx->pOl
35520 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c  dMethod;.    sql
35530 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b  ite3_free(pCtx);
35540 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c  .    return pFil
35550 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
35560 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  se(id);.  }.  re
35570 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35580 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  }....#endif /* d
35590 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
355a0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
355b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
355c0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72   */./*.** The pr
355d0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  oxy locking styl
355e0 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f  e is intended fo
355f0 72 20 75 73 65 20 77 69 74 68 20 41 46 50 20 66  r use with AFP f
35600 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41  ilesystems..** A
35610 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69 73 20  nd since AFP is 
35620 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
35630 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72  n MacOSX, the pr
35640 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
35650 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65  lso.** restricte
35660 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20  d to MacOSX..** 
35670 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
35680 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
35690 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d  he proxy lock im
356a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
356b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
356c0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
356d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
356e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
356f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35710 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  **/../*.** Initi
35720 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
35730 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
35740 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  face..**.** This
35750 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
35760 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65  rs all VFS imple
35770 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75  mentations for u
35780 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69  nix-like operati
35790 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20  ng.** systems.  
357a0 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e  This routine, an
357b0 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73  d the sqlite3_os
357c0 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74  _end() routine t
357d0 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20  hat follows,.** 
357e0 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e  should be the on
357f0 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ly routines in t
35800 68 69 73 20 66 69 6c 65 20 74 68 61 74 20 61 72  his file that ar
35810 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f  e visible from o
35820 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a  ther.** files..*
35830 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
35840 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
35850 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69   during SQLite i
35860 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e  nitialization an
35870 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  d by a.** single
35880 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 6d 65   thread.  The me
35890 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
358a0 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73  and mutex subsys
358b0 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a 2a  tems have not.**
358c0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62 65 65   necessarily bee
358d0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  n initialized wh
358e0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
358f0 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  is called, and s
35900 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  o they.** should
35910 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a 2f   not be used..*/
35920 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
35930 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f  init(void){ .  /
35940 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  * .  ** The foll
35950 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65 66 69  owing macro defi
35960 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  nes an initializ
35970 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65  er for an sqlite
35980 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20 20  3_vfs object..  
35990 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  ** The name of t
359a0 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45 2e 20  he VFS is NAME. 
359b0 20 54 68 65 20 70 41 70 70 44 61 74 61 20 69 73   The pAppData is
359c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
359d0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20  pointer.  ** to 
359e0 74 68 65 20 22 66 69 6e 64 65 72 22 20 66 75 6e  the "finder" fun
359f0 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44 61 74  ction.  (pAppDat
35a00 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  a is a pointer t
35a10 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65 63 61  o a pointer beca
35a20 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20 43  use.  ** silly C
35a30 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69 62 69  90 rules prohibi
35a40 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20 62  t a void* from b
35a50 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61 20 66  eing cast to a f
35a60 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 0a  unction pointer.
35a70 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20 68    ** and so we h
35a80 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f 75 67  ave to go throug
35a90 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  h the intermedia
35aa0 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76  te pointer to av
35ab0 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a  oid problems.  *
35ac0 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
35ad0 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
35ae0 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29 0a  errors on GCC.).
35af0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46 49    **.  ** The FI
35b00 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72 20 74  NDER parameter t
35b10 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
35b20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
35b30 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20  pointer to the. 
35b40 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63 74   ** finder-funct
35b50 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64 65 72  ion.  The finder
35b60 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  -function return
35b70 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
35b80 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 69  he.  ** sqlite_i
35b90 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
35ba0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
35bb0 20 74 68 65 20 64 65 73 69 72 65 64 20 6c 6f 63   the desired loc
35bc0 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76 69  king.  ** behavi
35bd0 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20 64 69  ors.  See the di
35be0 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74 68 61  vision above tha
35bf0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
35c00 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d 61  OMETHODS.  ** ma
35c10 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  cro for addition
35c20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
35c30 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73  finder-functions
35c40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74  ..  **.  ** Most
35c50 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20   finders simply 
35c60 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
35c70 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
35c80 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 20  te3_io_methods. 
35c90 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 74   ** object.  But
35ca0 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 6f   the "autolockIo
35cb0 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61 62 6c  Finder" availabl
35cc0 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 73  e on MacOSX does
35cd0 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20 6d   a little.  ** m
35ce0 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b 20 69  ore than that; i
35cf0 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  t looks at the f
35d00 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 74  ilesystem type t
35d10 68 61 74 20 68 6f 73 74 73 20 74 68 65 20 0a 20  hat hosts the . 
35d20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
35d30 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 63  e and tries to c
35d40 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e 67  hoose an locking
35d50 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70 72 69   method appropri
35d60 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 61  ate for.  ** tha
35d70 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74 69 6d  t filesystem tim
35d80 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e  e..  */.  #defin
35d90 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e 41 4d  e UNIXVFS(VFSNAM
35da0 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20 20 20  E, FINDER) {    
35db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35dc0 20 20 20 20 5c 0a 20 20 20 20 33 2c 20 20 20 20      \.    3,    
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35de0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
35df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e00 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75    \.    sizeof(u
35e10 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  nixFile),     /*
35e20 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20   szOsFile */    
35e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e40 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41  \.    MAX_PATHNA
35e50 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d  ME,         /* m
35e60 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20  xPathname */    
35e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
35e80 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
35e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
35ea0 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  xt */           
35eb0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
35ec0 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20 20 20    VFSNAME,      
35ed0 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
35ee0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
35ef0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
35f00 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c 20  (void*)&FINDER, 
35f10 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
35f20 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  a */            
35f30 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
35f40 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  ixOpen,         
35f50 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20      /* xOpen */ 
35f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f70 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
35f80 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
35f90 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20    /* xDelete */ 
35fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35fb0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63      \.    unixAc
35fc0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
35fd0 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20  /* xAccess */   
35fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ff0 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c    \.    unixFull
36000 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
36010 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
36020 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
36030 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e  \.    unixDlOpen
36040 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
36050 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20  DlOpen */       
36060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
36070 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c      unixDlError,
36080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
36090 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20  Error */        
360a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
360b0 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20    unixDlSym,    
360c0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
360d0 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  m */            
360e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
360f0 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20  unixDlClose,    
36100 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
36110 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
36120 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
36130 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  ixRandomness,   
36140 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
36150 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
36160 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
36170 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
36180 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20    /* xSleep */  
36190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
361a0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75      \.    unixCu
361b0 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
361c0 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
361d0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
361e0 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c    \.    unixGetL
361f0 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
36200 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
36210 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
36220 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e  \.    unixCurren
36230 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78  tTimeInt64, /* x
36240 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
36250 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 5c 0a   */           \.
36260 20 20 20 20 75 6e 69 78 53 65 74 53 79 73 74 65      unixSetSyste
36270 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65  mCall,    /* xSe
36280 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20  tSystemCall */  
36290 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
362a0 20 20 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43    unixGetSystemC
362b0 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53  all,    /* xGetS
362c0 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20 20  ystemCall */    
362d0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
362e0 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
362f0 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79  ll,   /* xNextSy
36300 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20 20 20  stemCall */     
36310 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20          \.  }.. 
36320 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66   /*.  ** All def
36330 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72 20 75  ault VFSes for u
36340 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  nix are containe
36350 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d in the followi
36360 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20  ng array..  **. 
36370 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
36380 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 70 4e  e sqlite3_vfs.pN
36390 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ext field of the
363a0 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73 20 6d   VFS object is m
363b0 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62 79 20  odified.  ** by 
363c0 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
363d0 77 68 65 6e 20 74 68 65 20 56 46 53 20 69 73 20  when the VFS is 
363e0 72 65 67 69 73 74 65 72 65 64 2e 20 20 53 6f 20  registered.  So 
363f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
36400 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f 74 20  ** array cannot 
36410 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20  be const..  */. 
36420 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
36430 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23  vfs aVfs[] = {.#
36440 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
36450 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
36460 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20 7c 7c  & (OS_VXWORKS ||
36470 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
36480 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56 46 53  __)).    UNIXVFS
36490 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20  ("unix",        
364a0 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64    autolockIoFind
364b0 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20  er ),.#else.    
364c0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20  UNIXVFS("unix", 
364d0 20 20 20 20 20 20 20 20 20 70 6f 73 69 78 49 6f           posixIo
364e0 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66  Finder ),.#endif
364f0 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
36500 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f  ix-none",     no
36510 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
36520 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
36530 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74  x-dotfile",  dot
36540 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
36550 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
36560 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
36570 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49  -namedsem", semI
36580 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
36590 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
365a0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
365b0 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  E.    UNIXVFS("u
365c0 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70  nix-posix",    p
365d0 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
365e0 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
365f0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
36600 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f  x-flock",    flo
36610 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
36620 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndif.#endif.#if 
36630 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
36640 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
36650 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
36660 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ).    UNIXVFS("u
36670 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61  nix-afp",      a
36680 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  fpIoFinder ),.  
36690 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
366a0 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73 49 6f  nfs",      nfsIo
366b0 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
366c0 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78  IXVFS("unix-prox
366d0 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69  y",    proxyIoFi
366e0 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
366f0 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
36700 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
36710 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
36720 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  /..  /* Register
36730 20 61 6c 6c 20 56 46 53 65 73 20 64 65 66 69 6e   all VFSes defin
36740 65 64 20 69 6e 20 74 68 65 20 61 56 66 73 5b 5d  ed in the aVfs[]
36750 20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28   array */.  for(
36760 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61  i=0; i<(sizeof(a
36770 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69  Vfs)/sizeof(sqli
36780 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b  te3_vfs)); i++){
36790 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
367a0 5f 72 65 67 69 73 74 65 72 28 26 61 56 66 73 5b  _register(&aVfs[
367b0 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20  i], i==0);.  }. 
367c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
367d0 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  K; .}../*.** Shu
367e0 74 64 6f 77 6e 20 74 68 65 20 6f 70 65 72 61 74  tdown the operat
367f0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
36800 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  face..**.** Some
36810 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
36820 6d 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ms might need to
36830 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70   do some cleanup
36840 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   in this routine
36850 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20  ,.** to release 
36860 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
36870 63 61 74 65 64 20 6f 62 6a 65 63 74 73 2e 20 20  cated objects.  
36880 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e  But not on unix.
36890 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
368a0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
368b0 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  unix..*/.int sql
368c0 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
368d0 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ){ .  return SQL
368e0 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e  ITE_OK; .}. .#en
368f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
36900 5f 55 4e 49 58 20 2a 2f 0a                       _UNIX */.